16 votes

Supprimez les zéros de tête mais pas tous les zéros.

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

par exemple :

my $number = "0000";

J'aimerais avoir :

my $number = "0";

J'ai essayé :

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

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

24voto

Mat Points 104488

Cela devrait fonctionner :

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

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

Edit : il s'avère que c'est un peu trop compliqué. Ceci devrait également fonctionner :

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

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

Consultez la réponse de Oesor Il n'y a pas de regex en jeu : c'est plutôt sympa aussi.

13voto

Oesor Points 4497

Cela n'a pas besoin d'être fait sous forme de regex.

my @nums = qw/ 00000 000 000001 002 00000005 00000064 /;
@nums = map { $_ + 0 } @nums;

8voto

cjm Points 44090
$number =~ s/^0+(?=\d)//;

Le lookahead positif permet de s'assurer qu'il reste au moins un chiffre. + au lieu de * signifie que la substitution est ignorée s'il n'y a pas de zéros de tête.

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

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

2voto

ysth Points 54757

Certaines réponses supposent implicitement qu'il n'y a que des chiffres présents 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

2voto

toolic Points 23449

Si votre $number est un nombre entier, une autre façon est d'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 ysth le fait remarquer, cela fonctionne pour tous les entiers, et pas seulement pour les entiers positifs comme je l'avais initialement indiqué.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X