Mittenchops
Mittenchops

Reputation: 19664

Usage example for Format method with leading zero padding for Big Ints in Golang

I would like to format a big int as a string with leading zeros. I'm looking for an example similar to this, but with Big:

I'm looking at source here.

But when I call:

m := big.NewInt(99999999999999)
fmt.Println(m.Format("%010000000000000000000","d"))

I see:

prog.go:10:22: m.Format("%010000000000000000000", "d") used as value
prog.go:10:23: cannot use "%010000000000000000000" (type string) as type fmt.State in argument to m.Format:
    string does not implement fmt.State (missing Flag method)
prog.go:10:48: cannot use "d" (type string) as type rune in argument to m.Format

(I understand normally I can use m.String(), but zero padding seems to complicate this, so I'm looking specifically for some help on the Format method.)

Here's my playground link.

Upvotes: 3

Views: 5727

Answers (2)

maerics
maerics

Reputation: 156434

You can simply use fmt.Sprintf(...) with the "%020s" directive (where 20 is whatever total length you want). The s verb will use the natural string format of the big int and the 020 modifier will create a string with total length of (at least) 20 with zero padding (instead of whitespace).

For example (Go Playground):

m := big.NewInt(99999999999999)
s := fmt.Sprintf("%020s", m)
fmt.Println(s)
// 00000099999999999999

Upvotes: 3

icza
icza

Reputation: 417767

The Int.Format() is not for you to call manually (although you could), but it is to implement fmt.Formatter so the fmt package will support formatting big.Int values out-of-the box.

See this example:

m := big.NewInt(99)
fmt.Printf("%06d\n", m)

if _, ok := m.SetString("1234567890123456789012345678901234567890", 10); !ok {
    panic("big")
}
fmt.Printf("%060d\n", m)

Outputs (try it on the Go Playground):

000099
000000000000000000001234567890123456789012345678901234567890

This is the simplest, so use this. Manually creating an fmt.Formatter gives you more control, but is also harder to do it. Unless this is a performance critical part of your app, just use the above solution.

Upvotes: 1

Related Questions