builtin: fix interpolation bug for `${x:g/G}`, where `x` is a zero or an infinity (#10271)
parent
aa861d1cac
commit
1343787009
|
@ -1,3 +1,5 @@
|
||||||
|
import strconv
|
||||||
|
|
||||||
fn test_common_atoi() {
|
fn test_common_atoi() {
|
||||||
// test common cases
|
// test common cases
|
||||||
assert '70zzz'.int() == 70
|
assert '70zzz'.int() == 70
|
||||||
|
@ -182,4 +184,38 @@ fn test_signed_cast() {
|
||||||
s := n.str() + 'z'
|
s := n.str() + 'z'
|
||||||
assert s.i16() == n
|
assert s.i16() == n
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// test g format
|
||||||
|
{
|
||||||
|
mut u := strconv.Float64u{
|
||||||
|
u: strconv.double_plus_zero
|
||||||
|
}
|
||||||
|
assert '${u.f:g}' == '0'
|
||||||
|
assert '${u.f:G}' == '0'
|
||||||
|
u.u = strconv.double_minus_zero
|
||||||
|
assert '${u.f:g}' == '0'
|
||||||
|
assert '${u.f:G}' == '0'
|
||||||
|
u.u = strconv.double_plus_infinity
|
||||||
|
assert '${u.f:g}' == '+inf'
|
||||||
|
assert '${u.f:G}' == '+INF'
|
||||||
|
u.u = strconv.double_minus_infinity
|
||||||
|
assert '${u.f:g}' == '-inf'
|
||||||
|
assert '${u.f:G}' == '-INF'
|
||||||
|
}
|
||||||
|
{
|
||||||
|
mut u := strconv.Float32u{
|
||||||
|
u: strconv.single_plus_zero
|
||||||
|
}
|
||||||
|
assert '${u.f:g}' == '0'
|
||||||
|
assert '${u.f:G}' == '0'
|
||||||
|
u.u = strconv.single_minus_zero
|
||||||
|
assert '${u.f:g}' == '0'
|
||||||
|
assert '${u.f:G}' == '0'
|
||||||
|
u.u = strconv.single_plus_infinity
|
||||||
|
assert '${u.f:g}' == '+inf'
|
||||||
|
assert '${u.f:G}' == '+INF'
|
||||||
|
u.u = strconv.single_minus_infinity
|
||||||
|
assert '${u.f:g}' == '-inf'
|
||||||
|
assert '${u.f:G}' == '-INF'
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -450,6 +450,37 @@ fn (data StrIntpData) get_fmt_format(mut sb strings.Builder) {
|
||||||
sb.write_string(f)
|
sb.write_string(f)
|
||||||
f.free()
|
f.free()
|
||||||
} else {
|
} else {
|
||||||
|
// Manage +/-0
|
||||||
|
if data.d.d_f32 == strconv.single_plus_zero {
|
||||||
|
tmp_str := '0'
|
||||||
|
strconv.format_str_sb(tmp_str, bf, mut sb)
|
||||||
|
tmp_str.free()
|
||||||
|
return
|
||||||
|
}
|
||||||
|
if data.d.d_f32 == strconv.single_minus_zero {
|
||||||
|
tmp_str := '-0'
|
||||||
|
strconv.format_str_sb(tmp_str, bf, mut sb)
|
||||||
|
tmp_str.free()
|
||||||
|
return
|
||||||
|
}
|
||||||
|
// Manage +/-INF
|
||||||
|
if data.d.d_f32 == strconv.single_plus_infinity {
|
||||||
|
mut tmp_str := '+inf'
|
||||||
|
if upper_case {
|
||||||
|
tmp_str = '+INF'
|
||||||
|
}
|
||||||
|
strconv.format_str_sb(tmp_str, bf, mut sb)
|
||||||
|
tmp_str.free()
|
||||||
|
}
|
||||||
|
if data.d.d_f32 == strconv.single_minus_infinity {
|
||||||
|
mut tmp_str := '-inf'
|
||||||
|
if upper_case {
|
||||||
|
tmp_str = '-INF'
|
||||||
|
}
|
||||||
|
strconv.format_str_sb(tmp_str, bf, mut sb)
|
||||||
|
tmp_str.free()
|
||||||
|
}
|
||||||
|
|
||||||
if data.d.d_f32 < 0 {
|
if data.d.d_f32 < 0 {
|
||||||
bf.positive = false
|
bf.positive = false
|
||||||
}
|
}
|
||||||
|
@ -487,6 +518,37 @@ fn (data StrIntpData) get_fmt_format(mut sb strings.Builder) {
|
||||||
sb.write_string(f)
|
sb.write_string(f)
|
||||||
f.free()
|
f.free()
|
||||||
} else {
|
} else {
|
||||||
|
// Manage +/-0
|
||||||
|
if data.d.d_f64 == strconv.double_plus_zero {
|
||||||
|
tmp_str := '0'
|
||||||
|
strconv.format_str_sb(tmp_str, bf, mut sb)
|
||||||
|
tmp_str.free()
|
||||||
|
return
|
||||||
|
}
|
||||||
|
if data.d.d_f64 == strconv.double_minus_zero {
|
||||||
|
tmp_str := '-0'
|
||||||
|
strconv.format_str_sb(tmp_str, bf, mut sb)
|
||||||
|
tmp_str.free()
|
||||||
|
return
|
||||||
|
}
|
||||||
|
// Manage +/-INF
|
||||||
|
if data.d.d_f64 == strconv.double_plus_infinity {
|
||||||
|
mut tmp_str := '+inf'
|
||||||
|
if upper_case {
|
||||||
|
tmp_str = '+INF'
|
||||||
|
}
|
||||||
|
strconv.format_str_sb(tmp_str, bf, mut sb)
|
||||||
|
tmp_str.free()
|
||||||
|
}
|
||||||
|
if data.d.d_f64 == strconv.double_minus_infinity {
|
||||||
|
mut tmp_str := '-inf'
|
||||||
|
if upper_case {
|
||||||
|
tmp_str = '-INF'
|
||||||
|
}
|
||||||
|
strconv.format_str_sb(tmp_str, bf, mut sb)
|
||||||
|
tmp_str.free()
|
||||||
|
}
|
||||||
|
|
||||||
if data.d.d_f64 < 0 {
|
if data.d.d_f64 < 0 {
|
||||||
bf.positive = false
|
bf.positive = false
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue