perl. regexp. убрать последние нули из записи числа

Elina74

Сначала из строки извлекаю само число (быть может не очень правильно?)
$str =~ /\d*)\.(\d*/;
Запоминаю его в промежуточную переменную
$strtmp = $1;
Отсекаю последние нули (которые после десятичной точки)
$strtmp =~ /(\d*\.\d*?0*)$/;
Запоминаю результат
$E = $1;
Чую, сделано кривовато.
Что известно про числа? Во-первых всегда в той строке, где есть это число, есть символ #, поэтому я не ошибусь, если буду проверять только те $str, где есть решетка. Число в такой строке только одно. Это число заведомо положительное. Но вот то, что в нем есть точка, или что оно записано не в экспоненциальной форме мне никто не гарантирует.
Как лучше эту задачу закодить?

shlyumper

Сформулируй задачу конкретнее. Например, что должно получиться из чисел:
1000000
1000.000
100.00e+00
0
?

Elina74

Извиняюсь. Если дана десятичная дробь в которой в дробной части последние несколько цифр — нули, надо избавиться от этих нулей, ибо они и так лишние.
1000000 -> 1000000
1000.000 - > 1000.0 (можно и просто 1000)
100.00e+00 -> 100e+00 (можно и просто 100)
0 -> 0
1123.344000 -> 1123.344

Marinavo_0507

sprintf не поможет?

bezoblachnaia


my $data = [
'1000000',
'1000.000',
'100.00e+00',
'0',
'1123.344000'
];

foreach my $str ( @$data )
{
(my $res = $str) =~ s/(\.0?[1-9]*)0*/$1/;

print "'$str' ---> '$res'\n";
}

OUTPUT:

'1000000' ---> '1000000'
'1000.000' ---> '1000.0'
'100.00e+00' ---> '100.0e+00'
'0' ---> '0'
'1123.344000' ---> '1123.344'

Maurog

'100.00e+00' ---> '100.0e+00'
ошибочка-с

sakura

Для этого нужно добавить еще одну строчку:

foreach my $str ( @$data )
{
(my $res = $str) =~ s/(\.0?[1-9]*)0*/$1/;

# 100.0e+00 ---> 100e+00
$res =~ s/\.0(e)/$1/i;

print "'$str' ---> '$res'\n";
}

output:

'1000000' ---> '1000000'
'1000.000' ---> '1000.0'
'100.00e+00' ---> '100e+00'
'100.10e+10' ---> '100.1e+10'
'100.12E+10' ---> '100.12E+10'
'0' ---> '0'
'1123.344000' ---> '1123.344'

Barbie29

вот так это делается
#!/usr/bin/perl

$_=qq~
1234
34 -4567
3456
-0.35e-0,2
56grf45
-.034 E20
-.034 e2,01 -,045 e-,23
-,034 e201 3e-.20
-,045 e-,23 e-0.88

4 E-0.20
22
E-21
-0.2 w 4 3
345
2 ^-,3
~;

$a='[+-]?\d*[,.]?\d+';print"$_\n"for/$a\s?[e^]$a|$a|[+-]?e$a/ig

Rolex

Ноль прибавь к строке которая содержит число и все.
my $string = "1000.000";
my $result = $string+0; # убираем конечные нули
print $string;
Оставить комментарий
Имя или ник:
Комментарий: