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