Wie kann ich sprintf auf Null Füllung auf eine variable Länge in Perl verwenden?
Frage
Ich möchte Perl benutzen sprintf zerofill eine Variable.
sprintf("%08d", $var);
Aber ich möchte dynamisch bestimmen, wie viele Stellen ZEROFILL.
Wie ersetze ich die "8" in sprintf("%08d", $var)
mit einer Variablen namens $zerofill
?
Lösung
Das erste Argument für sprintf ist nur eine Zeichenfolge:
my $zerofill = 9;
my $number = 1000;
my $filled = sprintf "%0${zerofill}d", $number;
Beachten Sie die Klammern Satz auseinander den Variablennamen aus dem Rest der Zeichenfolge.
Wir haben dieses besondere Problem als leicht kluge Übung in Learning Perl Menschen daran zu erinnern, dass Strings nur Strings. :)
Doch wie mobrule weist in seiner Antwort , sprintf viele Funktionen, die Ihnen diese Art von Flexibilität zu geben. Die Dokumentation für eine solche scheinbar einfache Funktion ist ziemlich lang und es gibt viele gute Sachen drin.
Andere Tipps
sprintf
und printf
Unterstützung der *
Notation (dies seit mindestens 5,8 gearbeitet hat):
printf "%0*d", 9, 12345;
000012345
printf '$%*.*f', 8, 2, 456.78;
$ 456.78
Ich brauchte etwas, etwas anderes zu tun. Null-Pad ein Gleitkommawert und eine exakte Länge erhalten
In meinem Fall muss ich genau 12 Bytes einschließlich dem Komma. Es ist etwas komplizierter als das, was Sie oben haben. Hier ist es für den Fall, jemand muss diese:
Say $ inputVal ist ein String übergeben von irgendwo mit einem Wert wie 1.001,1 . Beachten Sie, dass es sollte weniger als 12 Zeichen für diese zuverlässig arbeiten
# This will give us extra zeros, but the string may be too long
my $floatVal = sprintf('%*.*f', 12, 12, $inputValue);
# This will remove any extra zeros
$result = substr($floatVal, 0, 12);