打印时如何用零填充数字?

问题描述 投票:0回答:10

如何打印数字或制作带有零填充的字符串以使其固定宽度?

例如,如果我有号码

12
并且我想将其设为
000012

go format
10个回答
324
投票

fmt 包可以为你做到这一点:

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

输出:

|000012|   345|

注意 %06d 中的 0,这将使其宽度为 6 并用零填充。第二个将用空格填充。

在这里亲自尝试一下:http://play.golang.org/p/cinDspMccp


132
投票

使用

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

39
投票

有一种最简单的方法可以实现这一目标。使用

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:

的值
  • 如果输入为1,则输出将为01。
  • 如果输入为 12,则输出将为 12。
  • 如果输入是 1992,输出将为 1992。

您可以使用

%03d
或更多来填充更多零。


13
投票

以防万一,如果您想通过连接添加前缀或后缀来形成另一个单词,可以使用下面的代码。

package main

import "fmt"

func main() {
    concatenatedWord:= "COUNTER_"+fmt.Sprintf("%02d", 1)
    // use concatenatedWord 
        fmt.Println("ConcatenatedWordword is", concatenatedWord)
}

输出:ConcatenatedWordword 是 COUNTER_01

链接:https://play.golang.org/p/25g3L8TXiPP


12
投票

问题“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

6
投票
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"


2
投票

这是我的解决方案:

func leftZeroPad(number, padWidth int64) string {
    return fmt.Sprintf(fmt.Sprintf("%%0%dd", padWidth), number)
}

使用示例:

fmt.Printf("%v", leftZeroPad(12, 10))

打印:

0000000012

这样做的好处是,如果需要,您可以在运行时指定焊盘长度。


1
投票

对于那些想要右垫的人,你可以这样做:

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

1
投票

另一个选择是

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
}

https://pkg.go.dev/golang.org/x/text/number


1
投票
fmt.Printf("%012s", "345")

结果:

000000000345

© www.soinside.com 2019 - 2024. All rights reserved.