v / vlib / strconv
Raw file | 103 loc (87 sloc) | 1.97 KB | Latest commit hash fbb9e65c0
1module strconv
2
3import strings
4
5pub fn format_str_sb(s string, p BF_param, mut sb strings.Builder) {
6 if p.len0 <= 0 {
7 sb.write_string(s)
8 return
9 }
10
11 dif := p.len0 - utf8_str_visible_length(s)
12
13 if dif <= 0 {
14 sb.write_string(s)
15 return
16 }
17
18 if p.allign == .right {
19 for i1 := 0; i1 < dif; i1++ {
20 sb.write_u8(p.pad_ch)
21 }
22 }
23
24 sb.write_string(s)
25
26 if p.allign == .left {
27 for i1 := 0; i1 < dif; i1++ {
28 sb.write_u8(p.pad_ch)
29 }
30 }
31}
32
33const (
34 max_size_f64_char = 32 // the f64 max representation is -36,028,797,018,963,968e1023, 21 chars, 32 is faster for the memory manger
35 // digit pairs in reverse order
36 digit_pairs = '00102030405060708090011121314151617181910212223242526272829203132333435363738393041424344454647484940515253545556575859506162636465666768696071727374757677787970818283848586878889809192939495969798999'
37)
38
39// format_dec_sb format a u64
40[direct_array_access]
41pub fn format_dec_sb(d u64, p BF_param, mut res strings.Builder) {
42 mut n_char := dec_digits(d)
43 sign_len := if !p.positive || p.sign_flag { 1 } else { 0 }
44 number_len := sign_len + n_char
45 dif := p.len0 - number_len
46 mut sign_written := false
47
48 if p.allign == .right {
49 if p.pad_ch == `0` {
50 if p.positive {
51 if p.sign_flag {
52 res.write_u8(`+`)
53 sign_written = true
54 }
55 } else {
56 res.write_u8(`-`)
57 sign_written = true
58 }
59 }
60 // write the pad chars
61 for i1 := 0; i1 < dif; i1++ {
62 res.write_u8(p.pad_ch)
63 }
64 }
65
66 if !sign_written {
67 // no pad char, write the sign before the number
68 if p.positive {
69 if p.sign_flag {
70 res.write_u8(`+`)
71 }
72 } else {
73 res.write_u8(`-`)
74 }
75 }
76
77 // Legacy version
78 // max u64 18446744073709551615 => 20 byte
79 mut buf := [32]u8{}
80 mut i := 20
81 mut d1 := d
82 for i >= (21 - n_char) {
83 buf[i] = u8(d1 % 10) + `0`
84
85 d1 = d1 / 10
86 i--
87 }
88
89 for _ in 0 .. n_char {
90 i++
91 res.write_u8(buf[i])
92 }
93 i++
94
95 //===========================================
96
97 if p.allign == .left {
98 for i1 := 0; i1 < dif; i1++ {
99 res.write_u8(p.pad_ch)
100 }
101 }
102 return
103}