1 // Copyright 2009 The Go Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style
3 // license that can be found in the LICENSE file.
7 // FormatUint returns the string representation of i in the given base,
8 // for 2 <= base <= 36. The result uses the lower-case letters 'a' to 'z'
9 // for digit values >= 10.
10 func FormatUint(i
uint64, base
int) string {
11 _
, s
:= formatBits(nil, i
, base
, false, false)
15 // FormatInt returns the string representation of i in the given base,
16 // for 2 <= base <= 36. The result uses the lower-case letters 'a' to 'z'
17 // for digit values >= 10.
18 func FormatInt(i
int64, base
int) string {
19 _
, s
:= formatBits(nil, uint64(i
), base
, i
< 0, false)
23 // Itoa is shorthand for FormatInt(i, 10).
24 func Itoa(i
int) string {
25 return FormatInt(int64(i
), 10)
28 // AppendInt appends the string form of the integer i,
29 // as generated by FormatInt, to dst and returns the extended buffer.
30 func AppendInt(dst
[]byte, i
int64, base
int) []byte {
31 dst
, _
= formatBits(dst
, uint64(i
), base
, i
< 0, true)
35 // AppendUint appends the string form of the unsigned integer i,
36 // as generated by FormatUint, to dst and returns the extended buffer.
37 func AppendUint(dst
[]byte, i
uint64, base
int) []byte {
38 dst
, _
= formatBits(dst
, i
, base
, false, true)
43 digits
= "0123456789abcdefghijklmnopqrstuvwxyz"
44 digits01
= "0123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789"
45 digits10
= "0000000000111111111122222222223333333333444444444455555555556666666666777777777788888888889999999999"
48 var shifts
= [len(digits
) + 1]uint{
56 // formatBits computes the string representation of u in the given base.
57 // If neg is set, u is treated as negative int64 value. If append_ is
58 // set, the string is appended to dst and the resulting byte slice is
59 // returned as the first result value; otherwise the string is returned
60 // as the second result value.
62 func formatBits(dst
[]byte, u
uint64, base
int, neg
, append_
bool) (d
[]byte, s
string) {
63 if base
< 2 || base
> len(digits
) {
64 panic("strconv: illegal AppendInt/FormatInt base")
66 // 2 <= base && base <= len(digits)
68 var a
[64 + 1]byte // +1 for sign of 64bit value in base 2
77 // common case: use constants for / and % because
78 // the compiler can optimize it into a multiply+shift,
83 j
:= uintptr(u
- q
*100)
91 a
[i
] = digits
[uintptr(u
-q
*10)]
95 } else if s
:= shifts
[base
]; s
> 0 {
96 // base is power of 2: use shifts and masks instead of / and %
98 m
:= uintptr(b
) - 1 // == 1<<s - 1
101 a
[i
] = digits
[uintptr(u
)&m
]
110 a
[i
] = digits
[uintptr(u%b
)]
117 a
[i
] = digits
[uintptr(u
)]
126 d
= append(dst
, a
[i
:]...)