]> Cypherpunks repositories - gostls13.git/commitdiff
math/big: add %#b and %O integer formats
authorRuss Cox <rsc@golang.org>
Wed, 30 Jan 2019 05:55:38 +0000 (00:55 -0500)
committerRuss Cox <rsc@golang.org>
Tue, 26 Feb 2019 19:39:19 +0000 (19:39 +0000)
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>
src/math/big/intconv.go
src/math/big/intconv_test.go

index 6cca827c8e3412640a7b070faa6fe9d324e8f48b..65174c501860cfec223189b223ed64ba86983eff 100644 (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' {
index 2e01ee327dd8a9f6a0dd0292f9e65cf116e04ec6..d23a3e2beb42774b10045826caed0b904e3b63af 100644 (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"},