Golang: ¿Cómo rellenar un número con ceros al imprimir?

99

¿Cómo puedo imprimir un número o hacer una cadena con relleno de ceros para que tenga un ancho fijo?

Por ejemplo, si tengo el número 12y quiero hacerlo 000012.

Travis Reeder
fuente

Respuestas:

176

El paquete fmt puede hacer esto por usted:

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

Observe el 0 en% 06d, que lo convertirá en un ancho de 6 y lo rellenará con ceros. El segundo se rellenará con espacios.

Puedes verlo en acción aquí: http://play.golang.org/p/cinDspMccp

Travis Reeder
fuente
2
¿Qué pasa si quiero que la almohadilla esté a la derecha? usar la bandera -solo da espacios, necesito ceros.
majidarif
5
Si desea una cadena para trabajar más tarde, use en Sprintflugar dePrintf
oliverpool
42

Utilice la Printffunción del paquete fmt con un widthde 6y el carácter de relleno 0:

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

Configurando las widthobras poniendo un número entero directamente antes del especificador de 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'

Los únicos caracteres de relleno admitidos por Golang (y la mayoría de los otros idiomas) son espacios y 0:

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

Es posible justificar a la derecha la impresión anteponiendo un signo menos -:

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

Tenga en cuenta que para los números de punto flotante, el ancho incluye toda la cadena de formato:

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

Es útil tener en cuenta que el ancho también se puede establecer mediante programación usando en *lugar de un número y pasando el ancho como intparámetro:

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

Esto podría ser útil, por ejemplo, si el valor más grande que desea imprimir solo se conoce en tiempo de ejecución (llamado maxValen el siguiente ejemplo):

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

Por último, si no desea imprimir stdoutpero devolver una cadena, utilice Sprintftambién del paquete fmt con los mismos parámetros:

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

Hay una forma más sencilla de lograrlo. Utilizar

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

fmt.Sprintfformatea y devuelve una cadena sin imprimirla en ninguna parte. Aquí %02ddice pad cero a la izquierda para el valor que tiene <2 dígitos. Si el valor dado tiene 2 o más dígitos, no se rellenará. Por ejemplo:

  • Si la entrada es 1, la salida será 01.
  • Si la entrada es 12, la salida será 12.
  • Si la entrada es 1992, la salida será 1992.

Puede usar %03do más para un relleno de más ceros.

Jai Prak
fuente
10

La pregunta " Lista de formato de impresión en Go lang " nos recuerda que también existe la bandera:

- pad con espacios a la derecha en lugar de a la izquierda (justifique el campo a la izquierda)


Puede ver más ejemplos de relleno con DaddyOh/golang-samples/pad.go, si desea rellenar con otras secuencias de cadenas (más complejas que ' 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)

Ver 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
VonC
fuente
Eric Palmer eliminó su repositorio con muestras de golang para que el enlace ya no funcione.
Konstantin Azizov
1
@KonstantinAzizov Buen punto. He restaurado ese enlace. Algo así como.
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) resultado: "03"

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

keyzi
fuente