strconv: implement strconv.format_int(n, radix) and strconv.format_uint(n,radix)
parent
a8a81a1708
commit
22085041f1
|
@ -0,0 +1,45 @@
|
||||||
|
module strconv
|
||||||
|
|
||||||
|
const base_digits = '0123456789abcdefghijklmnopqrstuvwxyz'
|
||||||
|
|
||||||
|
// format_int returns the string representation of the number n in base `radix`
|
||||||
|
// for digit values > 10, this function uses the small latin leters a-z.
|
||||||
|
pub fn format_int(n i64, radix int) string {
|
||||||
|
if radix < 2 || radix > 36 {
|
||||||
|
panic('invalid radix: $radix . It should be => 2 and <= 36')
|
||||||
|
}
|
||||||
|
if n == 0 {
|
||||||
|
return '0'
|
||||||
|
}
|
||||||
|
mut n_copy := n
|
||||||
|
mut sign := ''
|
||||||
|
if n < 0 {
|
||||||
|
sign = '-'
|
||||||
|
n_copy = -n_copy
|
||||||
|
}
|
||||||
|
mut res := ''
|
||||||
|
for n_copy != 0 {
|
||||||
|
res = base_digits[n_copy % radix].str() + res
|
||||||
|
n_copy /= radix
|
||||||
|
}
|
||||||
|
return '$sign$res'
|
||||||
|
}
|
||||||
|
|
||||||
|
// format_uint returns the string representation of the number n in base `radix`
|
||||||
|
// for digit values > 10, this function uses the small latin leters a-z.
|
||||||
|
pub fn format_uint(n u64, radix int) string {
|
||||||
|
if radix < 2 || radix > 36 {
|
||||||
|
panic('invalid radix: $radix . It should be => 2 and <= 36')
|
||||||
|
}
|
||||||
|
if n == 0 {
|
||||||
|
return '0'
|
||||||
|
}
|
||||||
|
mut n_copy := n
|
||||||
|
mut res := ''
|
||||||
|
uradix := u64(radix)
|
||||||
|
for n_copy != 0 {
|
||||||
|
res = base_digits[n_copy % uradix].str() + res
|
||||||
|
n_copy /= uradix
|
||||||
|
}
|
||||||
|
return res
|
||||||
|
}
|
|
@ -0,0 +1,40 @@
|
||||||
|
import strconv
|
||||||
|
|
||||||
|
fn test_format_int() {
|
||||||
|
assert strconv.format_int(0, 2) == '0'
|
||||||
|
assert strconv.format_int(0, 10) == '0'
|
||||||
|
assert strconv.format_int(0, 16) == '0'
|
||||||
|
assert strconv.format_int(0, 36) == '0'
|
||||||
|
assert strconv.format_int(1, 2) == '1'
|
||||||
|
assert strconv.format_int(1, 10) == '1'
|
||||||
|
assert strconv.format_int(1, 16) == '1'
|
||||||
|
assert strconv.format_int(1, 36) == '1'
|
||||||
|
assert strconv.format_int(-1, 2) == '-1'
|
||||||
|
assert strconv.format_int(-1, 10) == '-1'
|
||||||
|
assert strconv.format_int(-1, 16) == '-1'
|
||||||
|
assert strconv.format_int(-1, 36) == '-1'
|
||||||
|
assert strconv.format_int(255, 2) == '11111111'
|
||||||
|
assert strconv.format_int(255, 8) == '377'
|
||||||
|
assert strconv.format_int(255, 10) == '255'
|
||||||
|
assert strconv.format_int(255, 16) == 'ff'
|
||||||
|
assert strconv.format_int(-255, 2) == '-11111111'
|
||||||
|
assert strconv.format_int(-255, 8) == '-377'
|
||||||
|
assert strconv.format_int(-255, 10) == '-255'
|
||||||
|
assert strconv.format_int(-255, 16) == '-ff'
|
||||||
|
for i in -256 .. 256 {
|
||||||
|
assert strconv.format_int(i, 10) == i.str()
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
fn test_format_uint() {
|
||||||
|
assert strconv.format_uint(0, 2) == '0'
|
||||||
|
assert strconv.format_int(255, 2) == '11111111'
|
||||||
|
assert strconv.format_int(255, 8) == '377'
|
||||||
|
assert strconv.format_int(255, 10) == '255'
|
||||||
|
assert strconv.format_int(255, 16) == 'ff'
|
||||||
|
assert strconv.format_uint(18446744073709551615, 2) ==
|
||||||
|
'1111111111111111111111111111111111111111111111111111111111111111'
|
||||||
|
assert strconv.format_uint(18446744073709551615, 16) == 'ffffffffffffffff'
|
||||||
|
assert strconv.parse_int('baobab', 36, 64) == 683058467
|
||||||
|
assert strconv.format_uint(683058467, 36) == 'baobab'
|
||||||
|
}
|
Loading…
Reference in New Issue