v / vlib / strconv / format_mem.js.v
100 lines · 84 sloc · 1.83 KB · fca336c895ec5eb0bf4fa074406df4acb78b9813
Raw
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.align == .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.align == .left {
27 for i1 := 0; i1 < dif; i1++ {
28 sb.write_u8(p.pad_ch)
29 }
30 }
31}
32
33// digit pairs in reverse order
34const digit_pairs = '00102030405060708090011121314151617181910212223242526272829203132333435363738393041424344454647484940515253545556575859506162636465666768696071727374757677787970818283848586878889809192939495969798999'
35
36// format_dec_sb format a u64
37@[direct_array_access]
38pub fn format_dec_sb(d u64, p BF_param, mut res strings.Builder) {
39 mut n_char := dec_digits(d)
40 sign_len := if !p.positive || p.sign_flag { 1 } else { 0 }
41 number_len := sign_len + n_char
42 dif := p.len0 - number_len
43 mut sign_written := false
44
45 if p.align == .right {
46 if p.pad_ch == `0` {
47 if p.positive {
48 if p.sign_flag {
49 res.write_u8(`+`)
50 sign_written = true
51 }
52 } else {
53 res.write_u8(`-`)
54 sign_written = true
55 }
56 }
57 // write the pad chars
58 for i1 := 0; i1 < dif; i1++ {
59 res.write_u8(p.pad_ch)
60 }
61 }
62
63 if !sign_written {
64 // no pad char, write the sign before the number
65 if p.positive {
66 if p.sign_flag {
67 res.write_u8(`+`)
68 }
69 } else {
70 res.write_u8(`-`)
71 }
72 }
73
74 // Legacy version
75 // max u64 18446744073709551615 => 20 byte
76 mut buf := [32]u8{}
77 mut i := 20
78 mut d1 := d
79 for i >= (21 - n_char) {
80 buf[i] = u8(d1 % 10) + `0`
81
82 d1 = d1 / 10
83 i--
84 }
85
86 for _ in 0 .. n_char {
87 i++
88 res.write_u8(buf[i])
89 }
90 i++
91
92 //===========================================
93
94 if p.align == .left {
95 for i1 := 0; i1 < dif; i1++ {
96 res.write_u8(p.pad_ch)
97 }
98 }
99 return
100}
101