Wie kann ich in Perl die Anzahl der Orte nach dem Dezimalpunkt einschränken, aber keine nachfolgenden Nullen haben?

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

  •  05-09-2019
  •  | 
  •  

Frage

Diese Frage ähnelt der "Ablauf von '.0' von Floats", aber für Perl und mit einer maximalen Anzahl von Ziffern nach der Dezimalzahl.

Ich suche nach einer Möglichkeit, Zahlen in das String -Format umzuwandeln und ein redundantes '0' fallen zu lassen, einschließlich nicht nur direkt nach der Dezimalzahl. Und immer noch mit einer maximalen Anzahl von Digital, z. B. 3

Die Eingabedaten sind Floats. Gewünschte Ausgabe:

0         -> 0
0.1       -> 0.1
0.11      -> 0.11
0.111     -> 0.111
0.1111111 -> 0.111
War es hilfreich?

Lösung

Sie können auch verwenden Math :: Runde um dies zu tun:

$ 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

Andere Tipps

Verwenden Sie Folgendes direkt:

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

print $s

... oder definieren Sie eine Unterroutine, um es genereller zu tun:

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

Drucke:

0
1
1.1
1.12
1.123
1.123
1.12
1.12345

Sie können "Sprintf" in Kombination mit "Eval" verwenden.

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

Zum Beispiel:

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

Ausgänge:

0
1
1
0.1
0.1
0.11
0.111
0.111
0.111

Dadurch erhalten Sie die Ausgabe, nach der Sie suchen,

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);
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top