web-dev-qa-db-fra.com

Comment composer un nombre avec des zéros lors de l'impression?

Comment puis-je imprimer un nombre ou créer une chaîne avec zéro remplissage pour le rendre largeur fixe?

Par exemple, si j'ai le numéro 12 et que je veux le rendre 000012

54
Travis Reeder

Le paquetage fmt peut le faire pour vous: 

fmt.Printf("|%06d|%6d|\n", 12, 345)

Remarquez le 0 dans% 06d, ce qui lui donnera une largeur de 6 et le complétera avec des zéros. Le second remplira d'espaces. 

Vous pouvez le voir en action ici: http://play.golang.org/p/cinDspMccp

125
Travis Reeder

Il existe un moyen simple d'y parvenir. Utilisation

func padNumberWithZero(value uint32) string {
    return fmt.Sprintf("%02d", value)
}

fmt.Sprintf formate et retourne une chaîne sans l’imprimer nulle part ..__ Ici %02d indique le zéro du pavé gauche pour la valeur qui a <2 nombre de chiffres. Si la valeur donnée a 2 chiffres ou plus, elle ne sera pas saturée. Par exemple:

  • Si l'entrée est 1, la sortie sera 01.
  • Si l'entrée est 12, la sortie sera 12.
  • Si l'entrée est 1992, la sortie sera 1992.

Vous pouvez utiliser %03d ou plus pour plus de remplissage de zéros.

16
Jai Prak

Utilisez la fonction Printf du paquet fmt avec une width de 6 et le caractère de remplissage 0:

import "fmt"
fmt.Printf("%06d", 12) // Prints to stdout '000012'

Le réglage de la largeur fonctionne comme suit:

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'
fmt.Printf("%06d", 12) // Uses 0 as the padding character,             prints '000012'

Printf dans Golang et la plupart des autres langues ne prend en charge que les espaces et 0 en tant que caractères de remplissage:

fmt.Printf("%6d", 12)   // Default padding is spaces, prints '    12'
fmt.Printf("%06d", 12)  // Change to 0 padding,       prints '000012'

Il est possible de justifier correctement l’impression en ajoutant un - moins:

fmt.Printf("%-6d", 12)   // Padding right-justified, prints '12    '

Attention, pour les nombres à virgule flottante, la largeur inclut toute la chaîne de format:

fmt.Printf("%6.1f", 12.0) // Prints '0012.0' (width is 6, precision is 1 digit)

Il est utile de noter que la largeur peut également être définie par programme en utilisant * au lieu d'un nombre et en transmettant la largeur en tant que paramètre int:

myWidth := 6
fmt.Printf("%0*d", myWidth, 12) // Prints '000012' as before

Par exemple, si cela peut être utile, considérez si vous connaissez la plus grande valeur que vous souhaitez imprimer maxVal:

myWidth := 1 + int(math.Log10(float64(maxVal)))
fmt.Printf("%*d", myWidth, nextVal)

Enfin, si vous ne souhaitez pas imprimer sur stdout mais récupérer une chaîne, utilisez Sprintf:

s := fmt.Sprintf("%06d", 12) // returns '000012' as a String
12
Christopher Oezbek

La question " Liste du format d'impression en Go lang " nous rappelle qu'il y a aussi le drapeau:

- pad avec des espaces à droite plutôt qu'à gauche (justifier à gauche le champ)


Vous pouvez voir plus d'exemples de remplissage avec DaddyOh/golang-samples/pad.go , si vous souhaitez utiliser d'autres séquences de chaîne (plus complexes que '0' ou ''):

  • 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)

Voir 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
6
VonC
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) résultat: "03"

lpad ("12", "0", 6) résultat: "000012"

0
keyzi