Comment supprimer tous les zéros non significatifs dans une chaîne

163

Si j'ai une chaîne

00020300504
00000234892839
000239074

comment puis-je me débarrasser des zéros de tête pour ne disposer que de ceci

20300504
234892839
239074

notez que le nombre ci-dessus a été généré de manière aléatoire.

Gérald
la source
S'agit-il de trois chaînes distinctes ou d'une chaîne avec des retours à la ligne séparant chaque nombre? J'ai remarqué lors de l'édition de votre question que vous aviez des <br>balises séparant les nombres; font-ils réellement partie de votre chaîne?
erisco

Réponses:

458

ltrim:

$str = ltrim($str, '0');
seul jour
la source
2
Avertissement $ str: = '0'. Adressé dans ma réponse, sur la base de cette réponse.
Mike Weir
pourquoi trop compliquer les choses? et mike c'est $ str + = 0; comme expliqué ici: nabtron.com/kiss-code
Nabeel Khan
@NabeelKhan Cela ne répondrait pas à la question, qui ne demande pas de convertir la chaîne en entier. Voir les commentaires sur la réponse de Svisstack pour savoir pourquoi ce n'est pas une si bonne solution.
Lonesomeday
@lonesomeday vous devriez lire attentivement sa question où il mentionne: "notez que le nombre ci-dessus a été généré au hasard." donc ce sont déjà des nombres entiers :)
Nabeel Khan
1
Attention: cela transformera '0' en ''
Goose
12
(string)((int)"00000234892839")
Svisstack
la source
J'ai juste essayé un (int) "00009384783473"(nombre aléatoire) et mon résultat était 2147483647. Si je le lance comme un flotteur cependant, il semble fonctionner correctement. Strange
JamesHalsall
manuel dit que "La taille d'un entier dépend de la plate-forme, bien qu'une valeur maximale d'environ deux milliards soit la valeur habituelle (soit 32 bits signés)"
llamerr
1
Pas étrange. Les entiers en php vont jusqu'à 2 ^ 31, soit 2147483647. Pour des nombres plus grands, vous devrez utiliser la solution basée sur les chaînes de lonesomeday.
awm
1
Casting to float peut sembler fonctionner, mais à un moment donné, vous obtiendrez des erreurs d'arrondi.
awm
1
Que diriez-vous de l'idée d'évaluer chacune des chaînes en utilisant une instruction de boucle, que quand il arrive à un chiffre (ou une chaîne) non nul, il obtiendra l'index de ce chiffre et supprimera tous les zéros précédents puis fera écho à la chaîne qui commence avec la première valeur non nulle ..
Gerald
10

Je ne sais pas pourquoi les gens utilisent des méthodes si complexes pour réaliser une chose aussi simple! Et regex? Hou la la!

Voilà, le moyen le plus simple et le plus simple (comme expliqué ici: https://nabtron.com/kiss-code/ ):

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

echo $a; // will output 1
Nabeel Khan
la source
2
Cela semble être une solution plus simple, mais elle ne gère aucune taille de chaîne comme le font les autres réponses. Vous convertissez d'une chaîne en entier, puis de nouveau en tant que chaîne - plus simple pour simplement raccourcir la chaîne.
Mike Weir
1
Intéressant, mais je ne sais pas si c'est la meilleure solution avec les conversions de type.
jonathanbell
1
S'il vous plaît ne faites pas cela ... c'est pourquoi PHP obtient une mauvaise réputation
Dan F.
9

Similaire à une autre suggestion, mais n'effacera pas le zéro réel:

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

Ou comme cela a été suggéré (à partir de PHP 5.3), l'opérateur ternaire abrégé peut être utilisé:

$str = ltrim($str, '0') ?: '0'; 
Mike Weir
la source
1
$str = ltrim($str, '0') ?: '0'; - pas d'appel trim redondant.
mickmackusa le
8

vous pouvez ajouter "+" dans votre variable,

exemple :

$numString = "0000001123000";
echo +$numString;
Anthony Kal
la source
3

Regex était déjà proposé, mais pas correctement:

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

la sortie est alors:

4523423400023402340240

Contexte sur Regex: les ^signaux début de chaîne et le +signe signale plus ou aucun des signes précédents. Par conséquent, l'expression régulière ^0+correspond à tous les zéros au début d'une chaîne.

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

Je ne pense pas que preg_replace soit la réponse ... vieux fil, mais il se trouve que je cherche cela aujourd'hui. Le casting ltrim et (int) est le gagnant.

<?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
la source
Si vous ajoutez l'opérateur ^ au début de l'expression régulière, c'est une solution valide.
deux fois le
0

Im fixe de cette façon.

c'est très simple. seulement passer une chaîne son supprimer zéro début de chaîne.

function removeZeroString($str='')
{
    while(trim(substr($str,0,1)) === '0')
    {
        $str = ltrim($str,'0');
    }
    return $str;
}
Ali Sufyan
la source
-1

Ajay Kumar propose l' écho le plus simple + $ numString; J'utilise ceux-ci:

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

En fait, toute fonction mathématique prendra le nombre de la "chaîne" et le traitera comme tel. C'est beaucoup plus simple que n'importe quelle regex ou fonction comparative. J'ai vu ça sur php.net, je ne me souviens pas où.

Jorge Garza
la source
-2

En supposant que vous souhaitiez supprimer un run-on de trois zéros ou plus et que votre exemple soit une chaîne:

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

Vous pouvez faire en sorte que le modèle regex corresponde à ce dont vous avez besoin si mes hypothèses sont fausses.

Cette aide?

Volonté
la source
1
Incorrect, désolé. Cela coupera également le «000» du milieu de la chaîne.
Filip OvertoneSinger Rydlo