/
number_to_base.c.v
67 lines (64 loc) · 1.57 KB
/
number_to_base.c.v
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
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.
@[direct_array_access; manualfree]
pub fn format_int(n i64, radix int) string {
unsafe {
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 have_minus := false
if n < 0 {
have_minus = true
n_copy = -n_copy
}
mut res := ''
for n_copy != 0 {
tmp_0 := res
bdx := int(n_copy % radix)
tmp_1 := strconv.base_digits[bdx].ascii_str()
res = tmp_1 + res
tmp_0.free()
tmp_1.free()
// res = base_digits[n_copy % radix].ascii_str() + res
n_copy /= radix
}
if have_minus {
final_res := '-' + res
res.free()
return final_res
}
return 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.
@[direct_array_access; manualfree]
pub fn format_uint(n u64, radix int) string {
unsafe {
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 {
tmp_0 := res
tmp_1 := strconv.base_digits[n_copy % uradix].ascii_str()
res = tmp_1 + res
tmp_0.free()
tmp_1.free()
// res = base_digits[n_copy % uradix].ascii_str() + res
n_copy /= uradix
}
return res
}
}