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.


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');

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")

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

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'; 

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;

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.


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

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;
}

-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.


-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?


1
Niepoprawnie, przepraszam. Spowoduje to również odcięcie „000” ze środka struny.
Filip OvertoneSinger Rydlo
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.