Golang: How to pad a number with zeros when printing?

前端 未结 6 1166
再見小時候
再見小時候 2020-12-12 19:01

How can I print a number or make a string with zero padding to make it fixed width?

For instance, if I have the number 12 and I want to make it 00

相关标签:
6条回答
  • 2020-12-12 19:02

    For those that want to right pad, you can do this:

    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
    
    0 讨论(0)
  • 2020-12-12 19:07
    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) result: "03"

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

    0 讨论(0)
  • 2020-12-12 19:09

    The fmt package can do this for you:

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

    Output:

    |000012|   345|
    

    Notice the 0 in %06d, that will make it a width of 6 and pad it with zeros. The second one will pad with spaces.

    Try it for yourself here: http://play.golang.org/p/cinDspMccp

    0 讨论(0)
  • 2020-12-12 19:12

    There is one simplest way to achieve this. Use

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

    fmt.Sprintf formats and returns a string without printing it anywhere. Here %02d says pad zero on left for value who has < 2 number of digits. If given value has 2 or more digits it will not pad. For example:

    • If input is 1, output will be 01.
    • If input is 12, output will be 12.
    • If input is 1992, output will be 1992.

    You can use %03d or more for more zeros padding.

    0 讨论(0)
  • 2020-12-12 19:15

    Use the Printf function from the fmt package with a width of 6 and the padding character 0:

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

    Setting the width works by putting an integer directly preceding the format specifier ('verb'):

    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'
    

    The only padding characters supported by Golang (and most other languages) are spaces and 0:

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

    It is possible to right-justify the printing by prepending a minus -:

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

    Beware that for floating point numbers the width includes the whole format string:

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

    It is useful to note that the width can also be set programmatically by using * instead of a number and passing the width as an int parameter:

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

    This might be useful for instance if the largest value you want to print is only known at runtime (called maxVal in the following example):

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

    Last, if you don't want to print to stdout but return a String, use Sprintf also from fmt package with the same parameters:

    s := fmt.Sprintf("%06d", 12) // returns '000012' as a String
    
    0 讨论(0)
  • 2020-12-12 19:16

    The question "List of printing format in Go lang" reminds us that there is also the flag:

    - pad with spaces on the right rather than the left (left-justify the field)


    You can see more padding examples with DaddyOh/golang-samples/pad.go, if you want to pad with other string sequences (more complex than '0' or ''):

    • 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)

    See 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
    
    0 讨论(0)
提交回复
热议问题