En Perl, ¿cómo puedo limitar el número de posiciones después del punto decimal, pero no tienen ceros?

StackOverflow https://stackoverflow.com/questions/571329

  •  05-09-2019
  •  | 
  •  

Pregunta

Esta pregunta es similar a "dejar caer detrás de' 0.0' de flotadores" , pero para Perl y con un número máximo de dígitos después de la coma decimal.

Estoy buscando una manera de convertir los números de formato de cadena, dejando caer cualquier redundante '0', que incluye no sólo justo después del punto decimal. Y aún con un número máximo de la tecnología digital, por ejemplo, 3

Los datos de entrada es flotadores. salida deseada:

0         -> 0
0.1       -> 0.1
0.11      -> 0.11
0.111     -> 0.111
0.1111111 -> 0.111
¿Fue útil?

Solución

También puede utilizar Matemáticas :: Ronda para hacer esto:

$ 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

Otros consejos

Utilice la siguiente directamente:

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

print $s

... o definir una subrutina para hacerlo más genéricamente:

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";

Las impresiones:

0
1
1.1
1.12
1.123
1.123
1.12
1.12345

Puede utilizar "sprintf" combinada con "eval".

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

Por ejemplo:

#!/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";
}

salidas:

0
1
1
0.1
0.1
0.11
0.111
0.111
0.111

Esto le dará la salida que busca,

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);
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top