Bir dizedeki tüm önde gelen sıfırlar nasıl kaldırılır


163

Eğer bir dizem varsa

00020300504
00000234892839
000239074

Baştaki sıfırlardan nasıl kurtulabilirim ki sadece buna sahip olacağım

20300504
234892839
239074

yukarıdaki sayının rastgele oluşturulduğunu unutmayın.


Bu üç ayrı dize mi yoksa her bir sayıyı ayıran yeni satırlı bir dize mi? Sorunuzu düzenlerken <br>sayıları ayıran etiketler olduğunu fark ettim ; aslında ipinizin bir parçası mı?
erisco

Yanıtlar:


458

ltrim:

$str = ltrim($str, '0');

2
Uyarı $ str: = '0'. Bu cevaba dayanarak cevabımda ele alındı.
Mike Weir

neden aşırı karmaşık şeyler? ve mike $ str + = 0; burada açıklandığı gibi: nabtron.com/kiss-code
Nabeel Khan

@NabeelKhan Yani gelmez soruya cevap olmaz değil tam sayıya dize dönüştürmek istiyoruz. Bunun neden bu kadar büyük bir çözüm olmadığı konusunda Svisstack'ın cevabındaki yorumlara bakın.
lonesomeday

@lonesomeday sorusunu nerede bahsettiğini dikkatlice okumalısınız: "yukarıdaki sayının rastgele oluşturulduğunu unutmayın." bu yüzden zaten tamsayılar :)
Nabeel Khan

1
Dikkat: Bu, '0'ı' '' 'olacak
Goose

12
(string)((int)"00000234892839")

Ben sadece (int) "00009384783473"(rastgele bir sayı) denedim ve sonuç 2147483647 oldu. Ancak eğer bir şamandıra olarak döküm, tamam çalışıyor gibi görünüyor. Garip
JamesHalsall

manual, "Bir tamsayı boyutu platforma bağlıdır, ancak en fazla yaklaşık iki milyar değer normal değerdir (32 bit imzalı)"
llamerr

1
Garip değil. Php tamsayılar 2147483647 olan 2 ^ 31 kadar gidin. Daha büyük sayılar için, lonesomeday'ın dize tabanlı çözümünü kullanmanız gerekir.
awm

1
Şamandıra dökümü işe yarayabilir, ancak bir noktada yuvarlama hataları alırsınız.
awm

1
bir dize ifadesi kullanarak dizenin her birini değerlendirme fikri hakkında, sıfır olmayan bir basamağa (veya dizeye) ulaştığında, bu basamağın dizinini alacak ve önceki sıfırların hepsini bırakacak ve ardından başlayan dizeyi yankılayacak sıfır olmayan ilk değerle ..
Gerald

10

İnsanların bu kadar basit bir şeyi başarmak için neden bu kadar karmaşık yöntemler kullandıklarını bilmiyorum! Ya normal ifade? Vaov!

İşte, en kolay ve en basit yol (burada açıklandığı gibi: https://nabtron.com/kiss-code/ ):

$a = '000000000000001';
$a += 0;

echo $a; // will output 1

2
Bu daha basit bir çözüm gibi görünüyor, ancak diğer cevapların yaptığı gibi herhangi bir dize boyutunu işlemez. Bir dizeden bir tamsayıya ve sonra bir dize olarak dönüştürüyorsunuz - dizeyi kısaltmak daha basit.
Mike Weir

1
İlginç, ancak tür dönüşümleri ile en iyi çözüm olup olmadığını bilmiyorum.
jonathanbell

1
Lütfen bunu yapma ... Bu yüzden PHP kötü bir temsilci alır
Dan F.

9

Başka bir öneriye benzer, ancak gerçek sıfatı ortadan kaldırmayacak:

if (ltrim($str, '0') != '') {
    $str = ltrim($str, '0');
} else {
    $str = '0';
}

Veya önerildiği gibi (PHP 5.3'ten itibaren), stenografi üçlü operatör kullanılabilir:

$str = ltrim($str, '0') ?: '0'; 

1
$str = ltrim($str, '0') ?: '0'; - gereksiz trim çağrısı yok.
mickmackusa

8

değişkeninize "+" ekleyebilirsiniz,

misal :

$numString = "0000001123000";
echo +$numString;

3

Normal ifade zaten önerilmiş, ancak doğru değil:

<?php
    $number = '00000004523423400023402340240';
    $withoutLeadingZeroes = preg_replace('/^0+/', '', $number)
    echo $withoutLeadingZeroes;
?>

çıktı o zaman:

4523423400023402340240

Regex ile ilgili arka plan: ^ipin başlangıcını ve +işaret, önceki işaretin daha fazlasını veya hiçini işaret etmez. Bu nedenle, normal ^0+ifade bir dizenin başındaki tüm sıfırlarla eşleşir.


preg_replace() expects at least 3 parameters, 2 given
TarangP

2

Ben preg_replace cevap .. eski konu olduğunu sanmıyorum ama sadece bugün bu arıyor. ltrim ve (int) oyuncu seçimi kazanır.

<?php
 $numString = "0000001123000";
 $actualInt = "1123000";

 $fixed_str1 = preg_replace('/000+/','',$numString);
 $fixed_str2 = ltrim($numString, '0');
 $fixed_str3 = (int)$numString;

 echo $numString . " Original";
 echo "<br>"; 
 echo $fixed_str1 . " Fix1";
 echo "<br>"; 
 echo $fixed_str2 . " Fix2";
 echo "<br>";
 echo $fixed_str3 . " Fix3";
 echo "<br>";
 echo $actualInt . " Actual integer in string";

 //output

 0000001123000 Origina
 1123 Fix1
 1123000 Fix2
 1123000 Fix3
 1123000 Actual integer in tring

^ Operatörünü normal ifadenin başına eklerseniz, bu geçerli bir çözümdür.
twicejr

0

Bu yolla düzeltildim.

çok basit. sadece bir dizeyi onun dizgesini sıfırdan başlatır.

function removeZeroString($str='')
{
    while(trim(substr($str,0,1)) === '0')
    {
        $str = ltrim($str,'0');
    }
    return $str;
}

-1

Ajay Kumar en basit yankıyı + $ numString'i sunar; Bunları kullanıyorum:

echo round($val = "0005");
echo $val = 0005;
    //both output 5
echo round($val = 00000648370000075845);
echo round($val = "00000648370000075845");
    //output 648370000075845, no need to care about the other zeroes in the number
    //like with regex or comparative functions. Works w/wo single/double quotes

Aslında herhangi bir matematik fonksiyonu sayıyı "string" den alır ve ona böyle davranır. Herhangi bir normal ifade veya karşılaştırmalı işlevlerden çok daha basittir. Bunu php.net'te gördüm, nerede olduğunu hatırlamıyorum.


-2

Üç veya daha fazla sıfırın kaldırılmasını istediğinizi ve örneğinizin bir dize olduğunu varsayarsak:

    $test_str ="0002030050400000234892839000239074";
    $fixed_str = preg_replace('/000+/','',$test_str);

Varsayımlarım kapalı olduğunda normal ifadeyi ihtiyacınız olana uygun hale getirebilirsiniz.

Bu yardım?


1
Yanlış, özür dilerim. Bu ayrıca '000' değerini dizenin ortasından kesecektir.
Filip OvertoneSinger Rydlo
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.