如何打印数字或制作零填充字符串以使其固定宽度?
例如,如果我有号码12
,我想将其设为000012
。
答案 0 :(得分:137)
fmt包可以为您完成此任务:
fmt.Printf("|%06d|%6d|\n", 12, 345)
注意%06d中的0,这将使其宽度为6并用零填充它。第二个将用空格填充。
您可以在此处看到它:http://play.golang.org/p/cinDspMccp
答案 1 :(得分:20)
有一种最简单的方法可以实现这一目标。使用
func padNumberWithZero(value uint32) string {
return fmt.Sprintf("%02d", value)
}
fmt.Sprintf
格式化并返回一个字符串而不在任何地方打印它。
这里%02d
表示左边的填充零值为< 2位数。如果给定值有2位或更多位数,则不会填充。例如:
您可以使用%03d
或更多来进行更多的零填充。
答案 2 :(得分:18)
使用fmt package中的Printf
函数,其中width
的{{1}}和填充字符6
:
0
设置import "fmt"
fmt.Printf("%06d", 12) // Prints to stdout '000012'
的工作原理如下:
width
Golang(和大多数其他语言)唯一支持的填充字符是空格和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'
:
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("%6.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)
而是返回一个字符串,请同时使用fmt package中的stdout
:
Sprintf
答案 3 :(得分:6)
问题“List of printing format in Go lang”提醒我们还有旗帜:
-
在右侧而不是左侧使用空格(左侧对齐字段)
如果您想填充其他字符串序列(比“0
”或“”更复杂),您可以使用
DaddyOh/golang-samples/pad.go
查看更多填充示例:
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
答案 4 :(得分:1)
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”
答案 5 :(得分:1)
数学方法:
func padLeft(v int64, length int) string {
abs := math.Abs(float64(v))
var padding int
if v != 0 {
min := math.Pow10(length - 1)
if min-abs > 0 {
l := math.Log10(abs)
if l == float64(int64(l)) {
l++
}
padding = length - int(math.Ceil(l))
}
} else {
padding = length - 1
}
builder := strings.Builder{}
if v < 0 {
length = length + 1
}
builder.Grow(length * 4)
if v < 0 {
builder.WriteRune('-')
}
for i := 0; i < padding; i++ {
builder.WriteRune('0')
}
builder.WriteString(strconv.FormatInt(int64(abs), 10))
return builder.String()
}
package main
import (
"fmt"
"math"
"strconv"
"strings"
)
func main() {
v := padLeft(0, 10)
fmt.Println(v, "length:", len(v), "expected (10)")
// 0000000000 length: 10 expected (10)
v = padLeft(5, 10)
fmt.Println(v, "length:", len(v), "expected (10)")
// 0000000005 length: 10 expected (10)
v = padLeft(12345, 10)
fmt.Println(v, "length:", len(v), "expected (10)")
// 0000012345 length: 10 expected (10)
v = padLeft(333, 6)
fmt.Println(v, "length:", len(v), "expected (6)")
// 000333 length: 6 expected (6)
v = padLeft(1, 10)
fmt.Println(v, "length:", len(v), "expected (10)")
// 0000000001 length: 10 expected (10)
v = padLeft(12345, 4)
fmt.Println(v, "length:", len(v), "expected (5)")
// 12345 length: 5 expected (5)
v = padLeft(3, 4)
fmt.Println(v, "length:", len(v), "expected (4)")
// 0003 length: 4 expected (4)
v = padLeft(-3, 4)
fmt.Println(v, "length:", len(v), "expected (5)")
// -0003 length: 5 expected (5)
}
func padLeft(v int64, length int) string {
abs := math.Abs(float64(v))
var padding int
if v != 0 {
min := math.Pow10(length - 1)
if min-abs > 0 {
l := math.Log10(abs)
if l == float64(int64(l)) {
l++
}
padding = length - int(math.Ceil(l))
}
} else {
padding = length -1
}
builder := strings.Builder{}
if v < 0 {
length = length + 1
}
builder.Grow(length * 4)
if v < 0 {
builder.WriteRune('-')
}
for i := 0; i < padding; i++ {
builder.WriteRune('0')
}
builder.WriteString(strconv.FormatInt(int64(abs), 10))
return builder.String()
}
https://play.golang.org/p/1gFUtMUQDlM
使用稍微修改的版本,因为我的价值观总是积极的:
// Random is basically just a rand.Rand in this case
func (r Random) codeWithFmt(length int) string {
max := int64(math.Pow10(length)) - 1
var v int64
for v == 0 {
v = r.Int63n(max)
}
return fmt.Sprintf("%0*d", length, v)
}
func (r Random) Code(digits int) string {
max := int64(math.Pow10(digits)) - 1
var v int64
for v == 0 {
v = r.Int63n(max)
}
var padding int
if math.Pow10(digits-1)-float64(v) > 0 {
lv := math.Log10(float64(v))
if lv == float64(int64(lv)) {
lv++
}
padding = digits - int(math.Ceil(lv))
}
builder := strings.Builder{}
builder.Grow(digits * 4)
for i := 0; i < padding; i++ {
builder.WriteRune('0')
}
builder.WriteString(strconv.FormatInt(v, 10))
return builder.String()
}
func BenchmarkCodeGeneration(b *testing.B) {
assert := require.New(b)
_ = assert
r := New()
for i := 0; i < b.N; i++ {
// assert.Len(r.Code(7), 7)
r.Code(7)
}
}
func BenchmarkCodeGenerationWithFmt(b *testing.B) {
assert := require.New(b)
_ = assert
r := New()
for i := 0; i < b.N; i++ {
// assert.Len(r.codeWithFmt(7), 7)
r.codeWithFmt(7)
}
}
BenchmarkCodeGeneration
BenchmarkCodeGeneration-8 5219466 204.8 ns/op 56 B/op 3 allocs/op
BenchmarkCodeGenerationWithFmt
BenchmarkCodeGenerationWithFmt-8 4306922 283.9 ns/op 32 B/op 4 allocs/op
答案 6 :(得分:0)
对于那些想要右击的人,您可以这样做:
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
答案 7 :(得分:0)
以防万一,如果您想通过连接来添加前缀或后缀以形成另一个单词,您可以使用以下代码。
package main
import "fmt"
func main() {
concatenatedWord:= "COUNTER_"+fmt.Sprintf("%02d", 1)
// use concatenatedWord
fmt.Println("ConcatenatedWordword is", concatenatedWord)
}
输出:ConcatenatedWordword 是 COUNTER_01
答案 8 :(得分:0)
另一个选项是 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)
}