Golang: come riempire un numero con zeri durante la stampa?


99

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:


176

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


2
E se volessi che il pad sia a destra? usare la bandiera -dà solo spazi, ho bisogno di zeri.
Majidarif

5
Se desideri utilizzare una stringa in seguito, usa Sprintfinvece diPrintf
oliverpool

42

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

29

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:

  • Se l'ingresso è 1, l'uscita sarà 01.
  • Se l'input è 12, l'output sarà 12.
  • Se l'input è il 1992, l'output sarà il 1992.

Puoi usare %03do più per riempire più zeri.


10

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

Eric Palmer ha rimosso il suo repository con campioni di golang, quindi il collegamento non funziona più.
Konstantin Azizov

1
@KonstantinAzizov Buon punto. Ho ripristinato quel collegamento. Una specie di.
VonC

3
func lpad(s string,pad string, plength int)string{
    for i:=len(s);i<plength;i++{
        s=pad+s
    }
    return s
}

lpad ("3", "0", 2) risultato: "03"

Risultato lpad ("12", "0", 6): "000012"

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.