如何打印数字或制作带有零填充的字符串以使其固定宽度?
例如,如果我有号码
12
并且我想将其设为000012
。
fmt 包可以为你做到这一点:
fmt.Printf("|%06d|%6d|\n", 12, 345)
输出:
|000012| 345|
注意 %06d 中的 0,这将使其宽度为 6 并用零填充。第二个将用空格填充。
在这里亲自尝试一下:http://play.golang.org/p/cinDspMccp
使用
fmt 包中的
Printf
函数,其中 width
为 6
和填充字符 0
:
import "fmt"
fmt.Printf("%06d", 12) // Prints to stdout '000012'
设置 width 可以通过在格式说明符(“动词”)之前直接放置一个整数来实现:
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'
Golang(和大多数其他语言)支持的唯一填充字符是空格和
0
:
fmt.Printf("%6d", 12) // Default padding is spaces, prints ' 12'
fmt.Printf("%06d", 12) // Change to 0 padding, prints '000012'
可以通过在前面加上减号来右对齐打印
-
:
fmt.Printf("%-6d", 12) // Padding right-justified, prints '12 '
请注意,对于 浮点数,宽度包括整个格式字符串:
fmt.Printf("%06.1f", 12.0) // Prints '0012.0' (width is 6, precision is 1 digit)
值得注意的是,还可以通过使用
*
而不是数字并将宽度作为 int
参数传递来以编程方式设置宽度:
myWidth := 6
fmt.Printf("%0*d", myWidth, 12) // Prints '000012' as before
如果您要打印的最大值仅在运行时已知(在以下示例中称为
maxVal
),这可能很有用:
myWidth := 1 + int(math.Log10(float64(maxVal)))
fmt.Printf("%*d", myWidth, nextVal)
最后,如果您不想打印到
stdout
但返回字符串,请使用 fmt 包中的
Sprintf
并具有相同的参数:
s := fmt.Sprintf("%06d", 12) // returns '000012' as a String
有一种最简单的方法可以实现这一目标。使用
func padNumberWithZero(value uint32) string {
return fmt.Sprintf("%02d", value)
}
fmt.Sprintf
格式化并返回字符串,而不将其打印到任何地方。
这里 %02d
表示在左侧填充零以表示拥有 < 2 number of digits. If given value has 2 or more digits it will not pad. For example: 的值
您可以使用
%03d
或更多来填充更多零。
以防万一,如果您想通过连接添加前缀或后缀来形成另一个单词,可以使用下面的代码。
package main
import "fmt"
func main() {
concatenatedWord:= "COUNTER_"+fmt.Sprintf("%02d", 1)
// use concatenatedWord
fmt.Println("ConcatenatedWordword is", concatenatedWord)
}
输出:ConcatenatedWordword 是 COUNTER_01
问题“Go lang中的打印格式列表”提醒我们还有一个flag:
在右侧而不是左侧填充空格(左对齐字段)-
如果您想用其他字符串序列填充(比 'DaddyOh/golang-samples/pad.go
' 或 '
0
' 更复杂),您可以使用
查看更多填充示例:
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)
参见 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
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) 结果:"03"
lpad("12","0",6) 结果:"000012"
这是我的解决方案:
func leftZeroPad(number, padWidth int64) string {
return fmt.Sprintf(fmt.Sprintf("%%0%dd", padWidth), number)
}
使用示例:
fmt.Printf("%v", leftZeroPad(12, 10))
打印:
0000000012
这样做的好处是,如果需要,您可以在运行时指定焊盘长度。
对于那些想要右垫的人,你可以这样做:
str2pad := "12"
padWith := "0"
amt2pad := 6
//This will make sure there is always 6 characters total, padded on the right side
//Note to check if strings.Repeat returns a negative value
paddedStr := str2pad + strings.Repeat(padWith, amt2pad - len(str2pad))
//Outputs 120000
另一个选择是
golang.org/x/text/number
套餐:
package main
import (
"golang.org/x/text/language"
"golang.org/x/text/message"
"golang.org/x/text/number"
)
var fmt = message.NewPrinter(language.English)
func main() {
n := number.Decimal(
12, number.Pad('0'), number.FormatWidth(6),
)
fmt.Println(n) // 000012
}
fmt.Printf("%012s", "345")
结果:
000000000345