1
0
mirror of https://github.com/golang/go synced 2024-11-06 09:26:18 -07:00

math/big: add %#b and %O integer formats

Matching fmt, %#b now prints an 0b prefix,
and %O prints octal with an 0o prefix.

See golang.org/design/19308-number-literals for background.

For #19308.
For #12711.

Change-Id: I139c5a9a1dfae15415621601edfa13c6a5f19cfc
Reviewed-on: https://go-review.googlesource.com/c/160250
Reviewed-by: Rob Pike <r@golang.org>
Reviewed-by: Robert Griesemer <gri@golang.org>
This commit is contained in:
Russ Cox 2019-01-30 00:55:38 -05:00
parent 675503c507
commit d6311ff1e4
2 changed files with 14 additions and 4 deletions

View File

@ -50,8 +50,9 @@ func writeMultiple(s fmt.State, text string, count int) {
var _ fmt.Formatter = intOne // *Int must implement fmt.Formatter
// Format implements fmt.Formatter. It accepts the formats
// 'b' (binary), 'o' (octal), 'd' (decimal), 'x' (lowercase
// hexadecimal), and 'X' (uppercase hexadecimal).
// 'b' (binary), 'o' (octal with 0 prefix), 'O' (octal with 0o prefix),
// 'd' (decimal), 'x' (lowercase hexadecimal), and
// 'X' (uppercase hexadecimal).
// Also supported are the full suite of package fmt's format
// flags for integral types, including '+' and ' ' for sign
// control, '#' for leading zero in octal and for hexadecimal,
@ -66,7 +67,7 @@ func (x *Int) Format(s fmt.State, ch rune) {
switch ch {
case 'b':
base = 2
case 'o':
case 'o', 'O':
base = 8
case 'd', 's', 'v':
base = 10
@ -98,6 +99,8 @@ func (x *Int) Format(s fmt.State, ch rune) {
prefix := ""
if s.Flag('#') {
switch ch {
case 'b': // binary
prefix = "0b"
case 'o': // octal
prefix = "0"
case 'x': // hexadecimal
@ -106,6 +109,9 @@ func (x *Int) Format(s fmt.State, ch rune) {
prefix = "0X"
}
}
if ch == 'O' {
prefix = "0o"
}
digits := x.abs.utoa(base)
if ch == 'X' {

View File

@ -214,8 +214,12 @@ var formatTests = []struct {
{"10", "%y", "%!y(big.Int=10)"},
{"-10", "%y", "%!y(big.Int=-10)"},
{"10", "%#b", "1010"},
{"10", "%#b", "0b1010"},
{"10", "%#o", "012"},
{"10", "%O", "0o12"},
{"-10", "%#b", "-0b1010"},
{"-10", "%#o", "-012"},
{"-10", "%O", "-0o12"},
{"10", "%#d", "10"},
{"10", "%#v", "10"},
{"10", "%#x", "0xa"},