web-dev-qa-db-fra.com

Supprimer les zéros non significatifs, mais pas tous

Comment puis-je supprimer tous les zéros de gauche mais laisser un zéro final si la valeur ne contient que des zéros?

par exemple:

my $number = "0000";

Je voudrais avoir:

my $number = "0";

J'ai essayé:

$number =~ s/^0*//; 

mais cela supprime bien sûr tous les zéros dans ce cas.

15
perlfoo

Cela devrait fonctionner:

$number =~ s/^0*(\d+)$/$1/;

0    -> 0
0000 -> 0
0001 -> 1

Edit: c'est un peu trop compliqué. Cela devrait également fonctionner:

$number =~ s/0*(\d+)/$1/;

mais je ne suis pas sûr de ce qui est meilleur dépend du cas d'utilisation.

Vérifiez la réponse de Oesor : c'est plutôt gentil aussi, sans regex impliqué.

21
Mat

Cela n'a pas besoin d'être fait en tant que regex.

my @nums = qw/ 00000 000 000001 002 00000005 00000064 /;
@nums = map { $_ + 0 } @nums;
12
Oesor
$number =~ s/^0+(?=\d)//;

Le signe d'anticipation positif garantit qu'il reste au moins un chiffre et l'utilisation de + au lieu de * signifie que la substitution est ignorée s'il n'y a pas de zéros au début.

Si vous essayez de normaliser des groupes de nombres dans une seule chaîne, utilisez simplement \b au lieu de ^ et effectuez une substitution globale:

my $data = "0225 0000 030";
$data =~ s/\b0+(?=\d)//g;
8
cjm

Si votre $number est un entier, vous pouvez également utiliser printf :

for my $number (qw(005 05 5 000 0 500)) {
    printf "%d\n", $number;
}

__END__

5
5
5
0
0
500

Edit: Comme le souligne Ysth, cela fonctionne pour tous les entiers, pas seulement les entiers positifs comme je l’ai dit à l’origine.

2
toolic

Certaines réponses supposent implicitement qu'il n'y a que des chiffres ou que $number est en fait un nombre. Si ce n'est pas le cas:

s/^0+(?=.)//s

Ou même:

substr($number,0,-1) =~ s/^0+//s
2
ysth

mon $ var = '0000035600000';

$ var = $ var + 0;

C'est tout!

0
jaimebl

Eh bien, si vous voulez tout remplacer par un, remplacez simplement par s/^0+/0/?

Cependant, cela remplacera tous les 0 premiers par un 0, donc si vous avez des zéros avant les nombres, vous aurez besoin de la construction de Mats.

0
fnokke