В Perl, как я могу ограничить количество мест после десятичной точки, но не иметь конечных нулей? - PullRequest
5 голосов
/ 21 февраля 2009

Этот вопрос похож на "отбрасывание трейлинга‘ .0 ’из числа с плавающей запятой" , но для Perl и с максимальным количеством цифр после десятичной дроби.

Я ищу способ преобразования чисел в строковый формат, отбрасывая любые лишние «0», в том числе не сразу после десятичной дроби. И все же с максимальным количеством цифровых, например, 3

Входные данные являются плавающими. Желаемый вывод:

0         -> 0
0.1       -> 0.1
0.11      -> 0.11
0.111     -> 0.111
0.1111111 -> 0.111

Ответы [ 4 ]

18 голосов
/ 21 февраля 2009

Используйте следующее напрямую:

my $s = sprintf('%.3f', $f);
$s =~ s/\.?0*$//;

print $s

... или определите подпрограмму, чтобы сделать ее более обобщенно:

sub fstr {
  my ($value,$precision) = @_;
  $precision ||= 3;
  my $s = sprintf("%.${precision}f", $value);
  $s =~ s/\.?0*$//;
  $s
}

print fstr(0) . "\n";
print fstr(1) . "\n";
print fstr(1.1) . "\n";
print fstr(1.12) . "\n";
print fstr(1.123) . "\n";
print fstr(1.12345) . "\n";
print fstr(1.12345, 2) . "\n";
print fstr(1.12345, 10) . "\n";

Печать:

0
1
1.1
1.12
1.123
1.123
1.12
1.12345
3 голосов
/ 12 февраля 2012

Вы можете использовать «sprintf» в сочетании с «eval».

my $num = eval sprintf('%.3f', $raw_num);

Например:

#!/usr/bin/perl 

my @num_array = (
    0, 1, 1.0, 0.1, 0.10, 0.11, 0.111, 0.1110, 0.1111111
);


for my $raw_num (@num_array) {
    my $num = eval sprintf('%.3f', $raw_num);
    print $num . "\n";
}

выходы:

0
1
1
0.1
0.1
0.11
0.111
0.111
0.111
3 голосов
/ 21 февраля 2009

Вы также можете использовать Math :: Round , чтобы сделать это:

$ perl -MMath::Round=nearest -e 'print nearest(.001, 0.1), "\n"'
0.1
$ perl -MMath::Round=nearest -e 'print nearest(.001, 0.11111), "\n"'
0.111
0 голосов
/ 21 февраля 2009

Это даст вам результат, который вы ищете,

sub dropTraillingZeros{
$_ = shift;
s/(\d*\.\d{3})(.*)/$1/;
s/(\d*\.\d)(00)/$1/;
s/(\d*\.\d{2})(0)/$1/;
print "$_\n";
}
dropTraillingZeros(0);
dropTraillingZeros(0.1);
dropTraillingZeros(0.11);
dropTraillingZeros(0.111);
dropTraillingZeros(0.11111111);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...