Jak usunąć wszystkie wiodące zera w ciągu

163

Jeśli mam ciąg

00020300504
00000234892839
000239074

jak pozbyć się wiodących zer, żeby mieć tylko to

20300504
234892839
239074

Zwróć uwagę, że powyższa liczba została wygenerowana losowo.

Gerald
źródło
Czy są to trzy oddzielne ciągi, czy jeden ciąg z znakami nowej linii oddzielającymi każdą liczbę? Podczas redagowania pytania zauważyłem, że masz <br>tagi oddzielające liczby; czy faktycznie są częścią twojego sznurka?
erisco

Odpowiedzi:

458

ltrim:

$str = ltrim($str, '0');
samotny dzień
źródło
2
Caveat $ str: = '0'. Adresowane w mojej odpowiedzi, w oparciu o tę odpowiedź.
Mike Weir
dlaczego zbyt skomplikowane rzeczy? a mikrofon to $ str + = 0; jak wyjaśniono tutaj: nabtron.com/kiss-code
Nabeel Khan
@NabeelKhan To nie odpowiadałoby na pytanie, które nie wymaga konwersji ciągu znaków na liczbę całkowitą. Zobacz komentarze do odpowiedzi Svisstack, aby dowiedzieć się, dlaczego nie jest to takie świetne rozwiązanie.
lonesomeday
@lonesomeday powinieneś uważnie przeczytać jego pytanie, w którym wspomina: „zwróć uwagę, że powyższa liczba została wygenerowana losowo”. więc są już liczbami całkowitymi :)
Nabeel Khan
1
Uwaga: to zmieni „0” w „”
Goose
12
(string)((int)"00000234892839")
Svisstack
źródło
Właśnie wypróbowałem (int) "00009384783473"(losową liczbę) i mój wynik to 2147483647. Jeśli jednak rzucę go jako pływaka, wydaje się, że działa dobrze. Dziwne
JamesHalsall
podręcznik mówi, że „Rozmiar liczby całkowitej jest zależny od platformy, chociaż zwykle maksymalna wartość to około dwa miliardy (czyli 32 bity ze
znakiem
1
Nie dziwne. Liczby całkowite w php idą do 2 ^ 31, czyli 2147483647. W przypadku większych liczb będziesz musiał użyć rozwiązania opartego na ciągach lonesomeday.
awm
1
Rzutowanie na zmiennoprzecinkowe może wydawać się działać, ale w pewnym momencie wystąpią błędy zaokrągleń.
awm
1
co powiesz na pomysł oceny każdego ciągu za pomocą instrukcji pętli, że kiedy dojdzie do niezerowej cyfry (lub ciągu), otrzyma indeks tej cyfry i porzuci wszystkie poprzednie zera, a następnie wyświetli ciąg, który zaczyna się z pierwszą wartością niezerową ...
Gerald,
10

Nie wiem, dlaczego ludzie używają tak złożonych metod, aby osiągnąć tak prostą rzecz! A regex? Łał!

Proszę bardzo, najłatwiej i najprostszy sposób (jak wyjaśniono tutaj: https://nabtron.com/kiss-code/ ):

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

echo $a; // will output 1
Nabeel Khan
źródło
2
Wydaje się, że jest to prostsze rozwiązanie, ale nie obsługuje żadnego rozmiaru łańcucha, tak jak inne odpowiedzi. Konwertujesz ciąg na liczbę całkowitą, a następnie z powrotem jako ciąg - prostsze jest po prostu skrócenie ciągu.
Mike Weir
1
Ciekawe, ale nie wiem, czy to najlepsze rozwiązanie przy konwersjach typów.
jonathanbell
1
Proszę, nie rób tego ... dlatego PHP ma złą reputację
Dan F.
9

Podobnie jak w przypadku innej sugestii, z wyjątkiem tego, że nie zatrze rzeczywistego zera:

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

Lub jak sugerowano (od PHP 5.3), można użyć skróconego operatora trójskładnikowego:

$str = ltrim($str, '0') ?: '0'; 
Mike Weir
źródło
1
$str = ltrim($str, '0') ?: '0'; - brak zbędnego wywołania trymowania
mickmackusa
8

możesz dodać „+” do swojej zmiennej,

przykład:

$numString = "0000001123000";
echo +$numString;
Anthony Kal
źródło
3

Regex został już zaproponowany, ale nie poprawnie:

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

wynik jest wtedy:

4523423400023402340240

Podstawowe informacje o Regex: ^sygnały początku łańcucha i +znak nie sygnalizują więcej lub żadnego znaku poprzedzającego. Dlatego wyrażenie regularne ^0+dopasowuje wszystkie zera na początku ciągu.

Fuujin
źródło
preg_replace() expects at least 3 parameters, 2 given
TarangP
2

Nie sądzę, że preg_replace jest odpowiedzią ... stary wątek, ale tak się złożyło, że szukałem tego dzisiaj. ltrim i (int) casting wygrywa.

<?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
Elcast
źródło
Jeśli dodasz operator ^ na początku wyrażenia regularnego, jest to poprawne rozwiązanie.
twicejr
0

Jestem naprawiony w ten sposób.

to jest bardzo proste. przekazuj tylko łańcuch, usuwając zerowy początek łańcucha.

function removeZeroString($str='')
{
    while(trim(substr($str,0,1)) === '0')
    {
        $str = ltrim($str,'0');
    }
    return $str;
}
Ali Sufyan
źródło
-1

Ajay Kumar oferuje najprostsze echo + $ numString; Używam tych:

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

Właściwie każda funkcja matematyczna pobierze liczbę z „ciągu znaków” i tak ją potraktuje. Jest to znacznie prostsze niż jakiekolwiek wyrażenie regularne lub funkcje porównawcze. Widziałem to na php.net, nie pamiętam gdzie.

Jorge Garza
źródło
-2

Zakładając, że chcesz usunąć trzy lub więcej zer, a Twój przykład to jeden ciąg:

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

Możesz dopasować wzorzec wyrażenia regularnego do tego, czego potrzebujesz, jeśli moje założenia są błędne.

Ta pomoc?

Będzie
źródło
1
Niepoprawnie, przepraszam. Spowoduje to również odcięcie „000” ze środka struny.
Filip OvertoneSinger Rydlo