So entfernen Sie alle führenden Nullen in einer Zeichenfolge


163

Wenn ich eine Schnur habe

00020300504
00000234892839
000239074

Wie kann ich die führenden Nullen loswerden, damit ich nur diese habe?

20300504
234892839
239074

Beachten Sie, dass die obige Zahl zufällig generiert wurde.


Sind das drei separate Zeichenfolgen oder eine Zeichenfolge mit Zeilenumbrüchen, die jede Zahl trennen? Beim Bearbeiten Ihrer Frage ist mir aufgefallen, dass Sie <br>Tags haben, die die Zahlen trennen. Sind sie tatsächlich Teil Ihrer Saite?
Erisco

Antworten:


458

ltrim::

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

2
Vorsichtsmaßnahme $ str: = '0'. In meiner Antwort angesprochen, basierend auf dieser Antwort.
Mike Weir

Warum überkomplizieren? und mike es ist $ str + = 0; wie hier erklärt: nabtron.com/kiss-code
Nabeel Khan

@NabeelKhan Das würde die Frage nicht beantworten, die nicht fragt, ob die Zeichenfolge in eine Ganzzahl konvertiert werden soll. In den Kommentaren zu Svisstacks Antwort erfahren Sie, warum dies keine so gute Lösung ist.
einsamer

@lonesomeday sollten Sie seine Frage sorgfältig lesen, wo er erwähnt: "Beachten Sie, dass die obige Zahl zufällig generiert wurde." also sind sie schon ganze Zahlen :)
Nabeel Khan

1
Achtung: Dies wird '0' in ''
Goose

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

Ich habe gerade eine (int) "00009384783473"(Zufallszahl) ausprobiert und mein Ergebnis war 2147483647. Wenn ich sie jedoch als Float gieße, scheint sie in Ordnung zu funktionieren. Seltsam
JamesHalsall

Handbuch sagt, dass "Die Größe einer Ganzzahl plattformabhängig ist, obwohl ein Maximalwert von etwa zwei Milliarden der übliche Wert ist (das sind 32 Bit signiert)"
llamerr

1
Nicht seltsam. Ganzzahlen in PHP gehen bis zu 2 ^ 31, was 2147483647 ist. Für größere Zahlen müssen Sie die stringbasierte Lösung von lonesomeday verwenden.
awm

1
Das Casting in Float scheint zu funktionieren, aber irgendwann werden Rundungsfehler angezeigt.
awm

1
Wie wäre es mit der Idee, jede Zeichenfolge mithilfe einer Schleifenanweisung auszuwerten? Wenn eine Ziffer ungleich Null (oder eine Zeichenfolge) erreicht wird, wird der Index dieser Ziffer abgerufen und alle vorhergehenden Nullen gelöscht. Anschließend wird die beginnende Zeichenfolge wiedergegeben mit dem ersten Wert ungleich Null ..
Gerald

10

Ich weiß nicht, warum Menschen so komplexe Methoden anwenden, um so etwas Einfaches zu erreichen! Und Regex? Beeindruckend!

Los geht's, der einfachste und einfachste Weg (wie hier erklärt: https://nabtron.com/kiss-code/ ):

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

echo $a; // will output 1

2
Dies scheint eine einfachere Lösung zu sein, behandelt jedoch keine Zeichenfolgengröße wie andere Antworten. Sie konvertieren von einer Zeichenfolge in eine Ganzzahl und dann als Zeichenfolge zurück - einfacher, die Zeichenfolge lediglich zu verkürzen.
Mike Weir

1
Interessant, aber ich weiß nicht, ob es die beste Lösung für die Typkonvertierungen ist.
Jonathanbell

1
Bitte tu das nicht ... deshalb bekommt PHP einen schlechten Ruf
Dan F.

9

Ähnlich wie bei einem anderen Vorschlag, außer dass die tatsächliche Null nicht ausgelöscht wird:

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

Oder wie vorgeschlagen (ab PHP 5.3), kann ein ternärer Kurzoperator verwendet werden:

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

1
$str = ltrim($str, '0') ?: '0'; - kein redundanter Trimmanruf.
Mickmackusa

8

Sie können "+" in Ihre Variable einfügen,

Beispiel:

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

3

Regex wurde bereits vorgeschlagen, aber nicht richtig:

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

Ausgabe ist dann:

4523423400023402340240

Hintergrund auf Regex: Die ^Signale, die am Anfang der Zeichenfolge beginnen, und das +Zeichen signalisieren mehr oder gar kein vorhergehendes Zeichen. Daher ^0+stimmt der reguläre Ausdruck mit allen Nullen am Anfang einer Zeichenfolge überein.


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

2

Ich denke nicht, dass preg_replace die Antwort ist. Alter Thread, aber ich suche heute einfach danach. ltrim und (int) Casting ist der Gewinner.

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

Wenn Sie den Operator ^ zu Beginn des regulären Ausdrucks hinzufügen, ist dies jedoch eine gültige Lösung.
zweimal

0

Ich bin auf diese Weise behoben.

es ist sehr einfach. Übergeben Sie nur eine Zeichenfolge, deren Nullpunkt am Anfang der Zeichenfolge liegt.

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

-1

Ajay Kumar bietet das einfachste Echo + $ numString; Ich benutze diese:

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

Tatsächlich nimmt jede mathematische Funktion die Zahl aus dem "String" und behandelt sie so. Es ist viel einfacher als alle regulären Ausdrücke oder Vergleichsfunktionen. Ich habe das in php.net gesehen, weiß nicht mehr wo.


-2

Angenommen, Sie möchten, dass ein Nachlauf von drei oder mehr Nullen entfernt wird und Ihr Beispiel eine Zeichenfolge ist:

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

Sie können das Regex-Muster an Ihre Bedürfnisse anpassen, wenn meine Annahmen nicht stimmen.

Diese Hilfe?


1
Falsch, sorry. Dadurch wird auch die '000' aus der Mitte der Zeichenfolge herausgeschnitten.
Filip OvertoneSinger Rydlo
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.