js,strconv: port some functions to JS backend, improve `rune.str()` (#12460)
parent
460f4523aa
commit
e3d98b1b28
|
@ -18,14 +18,14 @@ pub fn (c rune) repeat(count int) string {
|
|||
return c.str()
|
||||
}
|
||||
res := ''
|
||||
#res.str = String.fromCharCode(c.val)
|
||||
#res.str = String.fromCharCode(Number(c.val))
|
||||
|
||||
return res.repeat(count)
|
||||
}
|
||||
|
||||
pub fn (c rune) str() string {
|
||||
res := ''
|
||||
#res.str = String.fromCharCode(c.val)
|
||||
#res.str = String.fromCharCode(Number(c.val))
|
||||
|
||||
return res
|
||||
}
|
||||
|
|
|
@ -0,0 +1,103 @@
|
|||
module strconv
|
||||
|
||||
import strings
|
||||
|
||||
pub fn format_str_sb(s string, p BF_param, mut sb strings.Builder) {
|
||||
if p.len0 <= 0 {
|
||||
sb.write_string(s)
|
||||
return
|
||||
}
|
||||
|
||||
dif := p.len0 - utf8_str_visible_length(s)
|
||||
|
||||
if dif <= 0 {
|
||||
sb.write_string(s)
|
||||
return
|
||||
}
|
||||
|
||||
if p.allign == .right {
|
||||
for i1 := 0; i1 < dif; i1++ {
|
||||
sb.write_b(p.pad_ch)
|
||||
}
|
||||
}
|
||||
|
||||
sb.write_string(s)
|
||||
|
||||
if p.allign == .left {
|
||||
for i1 := 0; i1 < dif; i1++ {
|
||||
sb.write_b(p.pad_ch)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
const (
|
||||
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
|
||||
// digit pairs in reverse order
|
||||
digit_pairs = '00102030405060708090011121314151617181910212223242526272829203132333435363738393041424344454647484940515253545556575859506162636465666768696071727374757677787970818283848586878889809192939495969798999'
|
||||
)
|
||||
|
||||
// format_dec_sb format a u64
|
||||
[direct_array_access]
|
||||
pub fn format_dec_sb(d u64, p BF_param, mut res strings.Builder) {
|
||||
mut n_char := dec_digits(d)
|
||||
sign_len := if !p.positive || p.sign_flag { 1 } else { 0 }
|
||||
number_len := sign_len + n_char
|
||||
dif := p.len0 - number_len
|
||||
mut sign_written := false
|
||||
|
||||
if p.allign == .right {
|
||||
if p.pad_ch == `0` {
|
||||
if p.positive {
|
||||
if p.sign_flag {
|
||||
res.write_b(`+`)
|
||||
sign_written = true
|
||||
}
|
||||
} else {
|
||||
res.write_b(`-`)
|
||||
sign_written = true
|
||||
}
|
||||
}
|
||||
// write the pad chars
|
||||
for i1 := 0; i1 < dif; i1++ {
|
||||
res.write_b(p.pad_ch)
|
||||
}
|
||||
}
|
||||
|
||||
if !sign_written {
|
||||
// no pad char, write the sign before the number
|
||||
if p.positive {
|
||||
if p.sign_flag {
|
||||
res.write_b(`+`)
|
||||
}
|
||||
} else {
|
||||
res.write_b(`-`)
|
||||
}
|
||||
}
|
||||
|
||||
// Legacy version
|
||||
// max u64 18446744073709551615 => 20 byte
|
||||
mut buf := [32]byte{}
|
||||
mut i := 20
|
||||
mut d1 := d
|
||||
for i >= (21 - n_char) {
|
||||
buf[i] = byte(d1 % 10) + `0`
|
||||
|
||||
d1 = d1 / 10
|
||||
i--
|
||||
}
|
||||
|
||||
for j in 0 .. n_char {
|
||||
i++
|
||||
res.write_b(buf[i])
|
||||
}
|
||||
i++
|
||||
|
||||
//===========================================
|
||||
|
||||
if p.allign == .left {
|
||||
for i1 := 0; i1 < dif; i1++ {
|
||||
res.write_b(p.pad_ch)
|
||||
}
|
||||
}
|
||||
return
|
||||
}
|
|
@ -303,82 +303,3 @@ pub fn fxx_to_str_l_parse_no_dot(s string) string {
|
|||
res[r_i] = 0
|
||||
return unsafe { tos(res.data, r_i) }
|
||||
}
|
||||
|
||||
// dec_digits return the number of decimal digit of an u64
|
||||
pub fn dec_digits(n u64) int {
|
||||
if n <= 9_999_999_999 { // 1-10
|
||||
if n <= 99_999 { // 5
|
||||
if n <= 99 { // 2
|
||||
if n <= 9 { // 1
|
||||
return 1
|
||||
} else {
|
||||
return 2
|
||||
}
|
||||
} else {
|
||||
if n <= 999 { // 3
|
||||
return 3
|
||||
} else {
|
||||
if n <= 9999 { // 4
|
||||
return 4
|
||||
} else {
|
||||
return 5
|
||||
}
|
||||
}
|
||||
}
|
||||
} else {
|
||||
if n <= 9_999_999 { // 7
|
||||
if n <= 999_999 { // 6
|
||||
return 6
|
||||
} else {
|
||||
return 7
|
||||
}
|
||||
} else {
|
||||
if n <= 99_999_999 { // 8
|
||||
return 8
|
||||
} else {
|
||||
if n <= 999_999_999 { // 9
|
||||
return 9
|
||||
}
|
||||
return 10
|
||||
}
|
||||
}
|
||||
}
|
||||
} else {
|
||||
if n <= 999_999_999_999_999 { // 5
|
||||
if n <= 999_999_999_999 { // 2
|
||||
if n <= 99_999_999_999 { // 1
|
||||
return 11
|
||||
} else {
|
||||
return 12
|
||||
}
|
||||
} else {
|
||||
if n <= 9_999_999_999_999 { // 3
|
||||
return 13
|
||||
} else {
|
||||
if n <= 99_999_999_999_999 { // 4
|
||||
return 14
|
||||
} else {
|
||||
return 15
|
||||
}
|
||||
}
|
||||
}
|
||||
} else {
|
||||
if n <= 99_999_999_999_999_999 { // 7
|
||||
if n <= 9_999_999_999_999_999 { // 6
|
||||
return 16
|
||||
} else {
|
||||
return 17
|
||||
}
|
||||
} else {
|
||||
if n <= 999_999_999_999_999_999 { // 8
|
||||
return 18
|
||||
} else {
|
||||
if n <= 9_999_999_999_999_999_999 { // 9
|
||||
return 19
|
||||
}
|
||||
return 20
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
@ -174,3 +174,82 @@ fn multiple_of_power_of_five_64(v u64, p u32) bool {
|
|||
fn multiple_of_power_of_two_64(v u64, p u32) bool {
|
||||
return u32(bits.trailing_zeros_64(v)) >= p
|
||||
}
|
||||
|
||||
// dec_digits return the number of decimal digit of an u64
|
||||
pub fn dec_digits(n u64) int {
|
||||
if n <= 9_999_999_999 { // 1-10
|
||||
if n <= 99_999 { // 5
|
||||
if n <= 99 { // 2
|
||||
if n <= 9 { // 1
|
||||
return 1
|
||||
} else {
|
||||
return 2
|
||||
}
|
||||
} else {
|
||||
if n <= 999 { // 3
|
||||
return 3
|
||||
} else {
|
||||
if n <= 9999 { // 4
|
||||
return 4
|
||||
} else {
|
||||
return 5
|
||||
}
|
||||
}
|
||||
}
|
||||
} else {
|
||||
if n <= 9_999_999 { // 7
|
||||
if n <= 999_999 { // 6
|
||||
return 6
|
||||
} else {
|
||||
return 7
|
||||
}
|
||||
} else {
|
||||
if n <= 99_999_999 { // 8
|
||||
return 8
|
||||
} else {
|
||||
if n <= 999_999_999 { // 9
|
||||
return 9
|
||||
}
|
||||
return 10
|
||||
}
|
||||
}
|
||||
}
|
||||
} else {
|
||||
if n <= 999_999_999_999_999 { // 5
|
||||
if n <= 999_999_999_999 { // 2
|
||||
if n <= 99_999_999_999 { // 1
|
||||
return 11
|
||||
} else {
|
||||
return 12
|
||||
}
|
||||
} else {
|
||||
if n <= 9_999_999_999_999 { // 3
|
||||
return 13
|
||||
} else {
|
||||
if n <= 99_999_999_999_999 { // 4
|
||||
return 14
|
||||
} else {
|
||||
return 15
|
||||
}
|
||||
}
|
||||
}
|
||||
} else {
|
||||
if n <= 99_999_999_999_999_999 { // 7
|
||||
if n <= 9_999_999_999_999_999 { // 6
|
||||
return 16
|
||||
} else {
|
||||
return 17
|
||||
}
|
||||
} else {
|
||||
if n <= 999_999_999_999_999_999 { // 8
|
||||
return 18
|
||||
} else {
|
||||
if n <= 9_999_999_999_999_999_999 { // 9
|
||||
return 19
|
||||
}
|
||||
return 20
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
@ -366,7 +366,7 @@ fn (mut g JsGen) gen_builtin_type_defs() {
|
|||
g.gen_builtin_prototype(
|
||||
typ_name: typ_name
|
||||
default_value: 'new Number(0)'
|
||||
constructor: 'if (typeof(val) == "string") { this.val = val.charCodeAt() } else if (val instanceof string) { this.val = val.str.charCodeAt(); } else { this.val = Math.round(val) }'
|
||||
constructor: 'if (typeof(val) == "string") { this.val = val.charCodeAt() } else if (val instanceof string) { this.val = val.str.charCodeAt(); } else { this.val = Math.round(Number(val)) }'
|
||||
value_of: 'this.val | 0'
|
||||
to_string: 'new string(this.val + "")'
|
||||
eq: 'new bool(self.valueOf() === other.valueOf())'
|
||||
|
|
Loading…
Reference in New Issue