Source file
src/math/big/intconv.go
1
2
3
4
5
6
7 package big
8
9 import (
10 "errors"
11 "fmt"
12 "io"
13 )
14
15
16
17
18
19
20 func (x *Int) Text(base int) string {
21 if x == nil {
22 return "<nil>"
23 }
24 return string(x.abs.itoa(x.neg, base))
25 }
26
27
28
29 func (x *Int) Append(buf []byte, base int) []byte {
30 if x == nil {
31 return append(buf, "<nil>"...)
32 }
33 return append(buf, x.abs.itoa(x.neg, base)...)
34 }
35
36 func (x *Int) String() string {
37 return x.Text(10)
38 }
39
40
41 func writeMultiple(s fmt.State, text string, count int) {
42 if len(text) > 0 {
43 b := []byte(text)
44 for ; count > 0; count-- {
45 s.Write(b)
46 }
47 }
48 }
49
50 var _ fmt.Formatter = intOne
51
52
53
54
55
56
57
58
59
60
61
62
63 func (x *Int) Format(s fmt.State, ch rune) {
64
65 var base int
66 switch ch {
67 case 'b':
68 base = 2
69 case 'o':
70 base = 8
71 case 'd', 's', 'v':
72 base = 10
73 case 'x', 'X':
74 base = 16
75 default:
76
77 fmt.Fprintf(s, "%%!%c(big.Int=%s)", ch, x.String())
78 return
79 }
80
81 if x == nil {
82 fmt.Fprint(s, "<nil>")
83 return
84 }
85
86
87 sign := ""
88 switch {
89 case x.neg:
90 sign = "-"
91 case s.Flag('+'):
92 sign = "+"
93 case s.Flag(' '):
94 sign = " "
95 }
96
97
98 prefix := ""
99 if s.Flag('#') {
100 switch ch {
101 case 'o':
102 prefix = "0"
103 case 'x':
104 prefix = "0x"
105 case 'X':
106 prefix = "0X"
107 }
108 }
109
110 digits := x.abs.utoa(base)
111 if ch == 'X' {
112
113 for i, d := range digits {
114 if 'a' <= d && d <= 'z' {
115 digits[i] = 'A' + (d - 'a')
116 }
117 }
118 }
119
120
121 var left int
122 var zeros int
123 var right int
124
125
126 precision, precisionSet := s.Precision()
127 if precisionSet {
128 switch {
129 case len(digits) < precision:
130 zeros = precision - len(digits)
131 case len(digits) == 1 && digits[0] == '0' && precision == 0:
132 return
133 }
134 }
135
136
137 length := len(sign) + len(prefix) + zeros + len(digits)
138 if width, widthSet := s.Width(); widthSet && length < width {
139 switch d := width - length; {
140 case s.Flag('-'):
141
142 right = d
143 case s.Flag('0') && !precisionSet:
144
145 zeros = d
146 default:
147
148 left = d
149 }
150 }
151
152
153 writeMultiple(s, " ", left)
154 writeMultiple(s, sign, 1)
155 writeMultiple(s, prefix, 1)
156 writeMultiple(s, "0", zeros)
157 s.Write(digits)
158 writeMultiple(s, " ", right)
159 }
160
161
162
163
164
165
166
167
168
169
170
171
172 func (z *Int) scan(r io.ByteScanner, base int) (*Int, int, error) {
173
174 neg, err := scanSign(r)
175 if err != nil {
176 return nil, 0, err
177 }
178
179
180 z.abs, base, _, err = z.abs.scan(r, base, false)
181 if err != nil {
182 return nil, base, err
183 }
184 z.neg = len(z.abs) > 0 && neg
185
186 return z, base, nil
187 }
188
189 func scanSign(r io.ByteScanner) (neg bool, err error) {
190 var ch byte
191 if ch, err = r.ReadByte(); err != nil {
192 return false, err
193 }
194 switch ch {
195 case '-':
196 neg = true
197 case '+':
198
199 default:
200 r.UnreadByte()
201 }
202 return
203 }
204
205
206
207 type byteReader struct {
208 fmt.ScanState
209 }
210
211 func (r byteReader) ReadByte() (byte, error) {
212 ch, size, err := r.ReadRune()
213 if size != 1 && err == nil {
214 err = fmt.Errorf("invalid rune %#U", ch)
215 }
216 return byte(ch), err
217 }
218
219 func (r byteReader) UnreadByte() error {
220 return r.UnreadRune()
221 }
222
223 var _ fmt.Scanner = intOne
224
225
226
227
228 func (z *Int) Scan(s fmt.ScanState, ch rune) error {
229 s.SkipSpace()
230 base := 0
231 switch ch {
232 case 'b':
233 base = 2
234 case 'o':
235 base = 8
236 case 'd':
237 base = 10
238 case 'x', 'X':
239 base = 16
240 case 's', 'v':
241
242 default:
243 return errors.New("Int.Scan: invalid verb")
244 }
245 _, _, err := z.scan(byteReader{s}, base)
246 return err
247 }
248
View as plain text