¿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 12
y quiero hacerlo 000012
.
¿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 12
y quiero hacerlo 000012
.
Respuestas:
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
Sprintf
lugar dePrintf
Utilice la Printf
función del paquete fmt con un width
de 6
y el carácter de relleno 0
:
import "fmt"
fmt.Printf("%06d", 12) // Prints to stdout '000012'
Configurando las width
obras 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 int
pará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 maxVal
en el siguiente ejemplo):
myWidth := 1 + int(math.Log10(float64(maxVal)))
fmt.Printf("%*d", myWidth, nextVal)
Por último, si no desea imprimir stdout
pero devolver una cadena, utilice Sprintf
también del paquete fmt con los mismos parámetros:
s := fmt.Sprintf("%06d", 12) // returns '000012' as a String
Hay una forma más sencilla de lograrlo. Utilizar
func padNumberWithZero(value uint32) string {
return fmt.Sprintf("%02d", value)
}
fmt.Sprintf
formatea y devuelve una cadena sin imprimirla en ninguna parte. Aquí %02d
dice 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:
Puede usar %03d
o más para un relleno de más ceros.
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
-
solo da espacios, necesito ceros.