Come posso stampare un numero o creare una stringa con spaziatura zero per renderla a larghezza fissa?
Ad esempio, se ho il numero 12e voglio farlo 000012.
Come posso stampare un numero o creare una stringa con spaziatura zero per renderla a larghezza fissa?
Ad esempio, se ho il numero 12e voglio farlo 000012.
Risposte:
Il pacchetto fmt può farlo per te:
fmt.Printf("|%06d|%6d|\n", 12, 345)
Notare lo 0 in% 06d, che lo renderà una larghezza di 6 e lo riempirà di zeri. Il secondo riempirà di spazi.
Puoi vederlo in azione qui: http://play.golang.org/p/cinDspMccp
Sprintfinvece diPrintf
Usa la Printffunzione dal pacchetto fmt con un widthof 6e il carattere di riempimento 0:
import "fmt"
fmt.Printf("%06d", 12) // Prints to stdout '000012'
Impostazione dei widthlavori inserendo un numero intero che precede direttamente l'identificatore di formato ('verbo'):
fmt.Printf("%d", 12) // Uses default width, prints '12'
fmt.Printf("%6d", 12) // Uses a width of 6 and left pads with spaces, prints ' 12'
Gli unici caratteri di riempimento supportati da Golang (e dalla maggior parte delle altre lingue) sono gli spazi e 0:
fmt.Printf("%6d", 12) // Default padding is spaces, prints ' 12'
fmt.Printf("%06d", 12) // Change to 0 padding, prints '000012'
È possibile giustificare a destra la stampa anteponendo un segno meno -:
fmt.Printf("%-6d", 12) // Padding right-justified, prints '12 '
Fai attenzione che per i numeri in virgola mobile la larghezza include l'intera stringa di formato:
fmt.Printf("%6.1f", 12.0) // Prints '0012.0' (width is 6, precision is 1 digit)
È utile notare che la larghezza può anche essere impostata a livello *di codice utilizzando invece di un numero e passando la larghezza come intparametro:
myWidth := 6
fmt.Printf("%0*d", myWidth, 12) // Prints '000012' as before
Ciò potrebbe essere utile, ad esempio, se il valore più grande che si desidera stampare è noto solo in fase di esecuzione (chiamato maxValnel seguente esempio):
myWidth := 1 + int(math.Log10(float64(maxVal)))
fmt.Printf("%*d", myWidth, nextVal)
Infine, se non vuoi stampare stdoutma restituire una stringa, usa Sprintfanche dal pacchetto fmt con gli stessi parametri:
s := fmt.Sprintf("%06d", 12) // returns '000012' as a String
C'è un modo più semplice per ottenere questo risultato. Uso
func padNumberWithZero(value uint32) string {
return fmt.Sprintf("%02d", value)
}
fmt.Sprintfformatta e restituisce una stringa senza stamparla da nessuna parte. Qui %02ddice il pad zero a sinistra per il valore che ha un numero di cifre <2. Se il valore fornito ha 2 o più cifre, non verrà riempito. Per esempio:
Puoi usare %03do più per riempire più zeri.
La domanda " Elenco dei formati di stampa in Go lang " ci ricorda che è presente anche la bandiera:
-pad con spazi a destra anziché a sinistra (giustifica il campo a sinistra)
Puoi vedere più esempi di riempimento con DaddyOh/golang-samples/pad.go, se vuoi riempire con altre sequenze di stringhe (più complesse di " 0" o " "):
leftPad(s string, padStr string, pLen int)rightPad(s string, padStr string, pLen int)leftPad2Len(s string, padStr string, overallLen int)rightPad2Len(s string, padStr string, overallLen int)Vedi play.golang.org:
1234567890
leftPad(str, "*", 3) ***1234567890
leftPad2Len(str, "*-", 13) -*-1234567890
leftPad2Len(str, "*-", 14) *-*-1234567890
leftPad2Len(str, "*", 14) ****1234567890
leftPad2Len(str, "*-x", 14) x*-x1234567890
leftPad2Len(str, "ABCDE", 14) BCDE1234567890
leftPad2Len(str, "ABCDE", 4) 7890
rightPad(str, "*", 3) 1234567890***
rightPad(str, "*!", 3) 1234567890*!*!*!
rightPad2Len(str, "*-", 13) 1234567890*-*
rightPad2Len(str, "*-", 14) 1234567890*-*-
rightPad2Len(str, "*", 14) 1234567890****
rightPad2Len(str, "*-x", 14) 1234567890*-x*
rightPad2Len(str, "ABCDE", 14) 1234567890ABCD
rightPad2Len(str, "ABCDE", 4) 1234
-dà solo spazi, ho bisogno di zeri.