Come rimuovere tutti gli zeri iniziali in una stringa


163

Se ho una stringa

00020300504
00000234892839
000239074

come posso liberarmi degli zeri iniziali in modo da avere solo questo

20300504
234892839
239074

si noti che il numero sopra è stato generato in modo casuale.


Queste tre stringhe separate o una stringa con newline che separano ciascun numero? Durante la modifica della tua domanda ho notato che avevi <br>tag che separavano i numeri; fanno effettivamente parte della tua stringa?
erisco,

Risposte:


458

ltrim:

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

2
Avvertenza $ str: = '0'. Risolto nella mia risposta, sulla base di questa risposta.
Mike Weir,

perché complicare le cose? e mike è $ str + = 0; come spiegato qui: nabtron.com/kiss-code
Nabeel Khan

@NabeelKhan Quello non risponderebbe alla domanda, che non chiede di convertire la stringa in un numero intero. Vedi i commenti sulla risposta di Svisstack per il motivo per cui questa non è una soluzione eccezionale.
lunedì

@lonesomeday dovresti leggere attentamente la sua domanda in cui menziona: "nota che il numero sopra è stato generato casualmente". quindi sono già numeri interi :)
Nabeel Khan,

1
Attenzione: questo trasformerà '0' in ''
Goose

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

Ho appena provato un (int) "00009384783473"(numero casuale) e il mio risultato è stato 2147483647. Tuttavia, se lo lancio come float, sembra funzionare bene. Strano
JamesHalsall,

il manuale dice che "La dimensione di un numero intero dipende dalla piattaforma, sebbene un valore massimo di circa due miliardi sia il valore normale (con 32 bit firmati)"
llamerr

1
Non strano. I numeri interi in php vanno fino a 2 ^ 31, ovvero 2147483647. Per numeri più grandi, dovrai usare la soluzione basata su stringhe di solitario.
awm

1
Il casting su float potrebbe sembrare funzionare, ma ad un certo punto otterrai errori di arrotondamento.
awm

1
che ne dici dell'idea di valutare ciascuna stringa usando un'istruzione loop, che quando arriva a una cifra (o stringa) diversa da zero, otterrà l'indice di quella cifra e rilascerà tutti gli zero precedenti, quindi farà eco alla stringa che inizia con il primo valore diverso da zero ..
Gerald

10

Non so perché le persone stiano usando metodi così complessi per ottenere una cosa così semplice! E regex? Wow!

Ecco qui, il modo più semplice e semplice (come spiegato qui: https://nabtron.com/kiss-code/ ):

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

echo $a; // will output 1

2
Sembra una soluzione più semplice, ma non gestisce alcuna stringa di stringa come fanno le altre risposte. Stai convertendo da una stringa a un numero intero e poi di nuovo come una stringa - più semplice semplicemente accorciare la stringa.
Mike Weir,

1
Interessante, ma non so se sia la soluzione migliore con le conversioni di tipo.
jonathanbell

1
Per favore, non farlo ... questo è il motivo per cui PHP ottiene una cattiva reputazione
Dan F.

9

Simile a un altro suggerimento, tranne che non cancellerà lo zero effettivo:

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

O come è stato suggerito (a partire da PHP 5.3), è possibile utilizzare l'operatore sternale stenografico:

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

1
$str = ltrim($str, '0') ?: '0'; - nessuna chiamata di assetto ridondante.
Mickmackusa,

8

puoi aggiungere "+" nella tua variabile,

esempio :

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

3

Regex è stato già proposto, ma non correttamente:

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

l'output è quindi:

4523423400023402340240

Contesto su Regex: i ^segnali iniziano la stringa e il +segno segnala più o nessuno del segno precedente. Pertanto, regex ^0+corrisponde a tutti gli zeri all'inizio di una stringa.


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

2

Non credo che preg_replace sia la risposta ... vecchio thread, ma capita solo di cercarlo oggi. ltrim e (int) casting sono i vincitori.

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

Se aggiungi l'operatore ^ all'inizio di regex, è comunque una soluzione valida.
volte il

0

Sono stato risolto in questo modo.

è molto semplice. passa solo una stringa e rimuove zero inizio della stringa.

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

-1

Ajay Kumar offre l' eco più semplice + $ numString; Io uso questi:

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

In realtà qualsiasi funzione matematica prenderà il numero dalla "stringa" e lo tratterà in questo modo. È molto più semplice di qualsiasi regex o funzioni comparative. L'ho visto in php.net, non ricordo dove.


-2

Supponendo di voler rimuovere un run-on di tre o più zeri e il tuo esempio è una stringa:

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

Puoi fare in modo che il modello regex si adatti a ciò di cui hai bisogno se i miei presupposti sono disattivati.

Questo aiuto?


1
Scusa, scusa. Ciò taglierà anche '000' dal centro della stringa.
Filip OvertoneSinger Rydlo,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.