Come posso utilizzare sprintf per riempire a zero una lunghezza variabile in Perl?

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

  •  20-09-2019
  •  | 
  •  

Domanda

Voglio usare Perl sprintf per riempire a zero una variabile.

sprintf("%08d", $var);

Ma voglio determinare dinamicamente quante cifre riempire con zero.

Come faccio a sostituire l'"8" in sprintf("%08d", $var) con una variabile chiamata $zerofill?

È stato utile?

Soluzione

Il primo argomento di sprintf è solo una stringa:

 my $zerofill = 9;
 my $number = 1000;
 my $filled = sprintf "%0${zerofill}d", $number;

Si notino le parentesi graffe per impostare a parte il nome della variabile dal resto della stringa.

Abbiamo questo particolare problema come un esercizio un po 'intelligente nella Learning Perl per ricordare alla gente che le stringhe sono solo stringhe. :)

Tuttavia, come mobrule sottolinea nella sua risposta , sprintf ha molte caratteristiche per dare questo tipo di flessibilità. La documentazione per una funzione come apparentemente semplice è piuttosto lungo e ci sono un sacco di chicche in esso.

Altri suggerimenti

sprintf e printf sostenere la notazione * (questo ha funzionato a partire almeno 5.8):


printf "%0*d", 9, 12345;

000012345

printf '$%*.*f', 8, 2, 456.78;

$  456.78

Avevo bisogno di fare qualcosa di leggermente diverso:zero riempi un valore in virgola mobile e ottieni una lunghezza esatta.

Nel mio caso ho bisogno esattamente di 12 byte compreso il punto decimale.È leggermente più complicato di quello che hai sopra.Eccolo nel caso qualcuno ne avesse bisogno:

Supponiamo che $inputVal sia una stringa passata da qualche parte con un valore simile 1001.1.Tieni presente che, affinché funzioni in modo affidabile, dovrebbero essere inferiori a 12 caratteri

 # 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);
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top