Удалить ведущие нули, но не все нули - PullRequest
15 голосов
/ 15 апреля 2011

Как я могу удалить все начальные нули, но оставить конечный ноль, если значение содержит только нули?

например:

my $number = "0000";

Хотелось бы иметь:

my $number = "0";

Я пытался:

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

но это, конечно, удаляет все нули в этом случае.

Ответы [ 7 ]

21 голосов
/ 15 апреля 2011

Это должно работать:

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

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

Редактировать: оказывается, это слишком сложно.Это также должно работать:

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

, но я не уверен, что лучше, зависит от варианта использования.

Проверьте ответ от Oesor :это тоже довольно мило, без регулярных выражений.

12 голосов
/ 15 апреля 2011

Это не нужно делать как регулярное выражение.

my @nums = qw/ 00000 000 000001 002 00000005 00000064 /;
@nums = map { $_ + 0 } @nums;
8 голосов
/ 15 апреля 2011
$number =~ s/^0+(?=\d)//;

Положительный прогноз гарантирует, что осталась хотя бы одна цифра, и использование + вместо * означает, что подстановка пропускается, если нет начальных нулей.

Если вы пытаетесь нормализовать группы чисел в одной строке, просто используйте \b вместо ^ и выполните глобальную подстановку:

my $data = "0225 0000 030";
$data =~ s/\b0+(?=\d)//g;
2 голосов
/ 15 апреля 2011

Если ваш $number является целым числом, другой способ - использовать printf :

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

__END__

5
5
5
0
0
500

Редактировать: Как указывает ysth, он работает для всех целых чисел, а не только для положительных целых чисел, как я первоначально сказал.

2 голосов
/ 15 апреля 2011

В некоторых ответах подразумевается, что присутствуют только цифры или что $number на самом деле число.Если это не так:

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

Или даже:

substr($number,0,-1) =~ s/^0+//s
1 голос
/ 24 декабря 2014

Просто добавьте 0 к строке, чтобы она неявно преобразовалась в число:

my $var = '0000035600000';
$var += 0;
0 голосов
/ 15 апреля 2011

Ну, если вы хотите заменить все на одно, просто измените на s/^0+/0/?

Однако это заменит все ведущие 0 на один 0, так что если у вас есть начальные нули перед числами, вам понадобится конструкция Mats.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...