Fix %g in fmt, and make %v default to %g for floats

This commit is contained in:
gingerBill
2023-12-21 17:05:24 +00:00
parent 509712f771
commit 55f3e99f63
2 changed files with 19 additions and 8 deletions
+12 -6
View File
@@ -1232,8 +1232,12 @@ _pad :: proc(fi: ^Info, s: string) {
// //
// NOTE: Can return "NaN", "+Inf", "-Inf", "+<value>", or "-<value>". // NOTE: Can return "NaN", "+Inf", "-Inf", "+<value>", or "-<value>".
// //
_fmt_float_as :: proc(fi: ^Info, v: f64, bit_size: int, verb: rune, float_fmt: byte) { _fmt_float_as :: proc(fi: ^Info, v: f64, bit_size: int, verb: rune, float_fmt: byte, prec: int) {
prec := fi.prec if fi.prec_set else 3 prec := prec
if fi.prec_set {
prec = fi.prec
}
buf: [386]byte buf: [386]byte
// Can return "NaN", "+Inf", "-Inf", "+<value>", "-<value>". // Can return "NaN", "+Inf", "-Inf", "+<value>", "-<value>".
@@ -1242,7 +1246,7 @@ _fmt_float_as :: proc(fi: ^Info, v: f64, bit_size: int, verb: rune, float_fmt: b
if !fi.plus { if !fi.plus {
// Strip sign from "+<value>" but not "+Inf". // Strip sign from "+<value>" but not "+Inf".
if str[0] == '+' && str[1] != 'I' { if str[0] == '+' && str[1] != 'I' {
str = str[1:] str = str[1:]
} }
} }
@@ -1258,11 +1262,13 @@ _fmt_float_as :: proc(fi: ^Info, v: f64, bit_size: int, verb: rune, float_fmt: b
// //
fmt_float :: proc(fi: ^Info, v: f64, bit_size: int, verb: rune) { fmt_float :: proc(fi: ^Info, v: f64, bit_size: int, verb: rune) {
switch verb { switch verb {
case 'f', 'F', 'g', 'G', 'v': case 'g', 'G', 'v':
_fmt_float_as(fi, v, bit_size, verb, 'f') _fmt_float_as(fi, v, bit_size, verb, 'g', -1)
case 'f', 'F':
_fmt_float_as(fi, v, bit_size, verb, 'f', 3)
case 'e', 'E': case 'e', 'E':
// BUG(): "%.3e" returns "3.000e+00" // BUG(): "%.3e" returns "3.000e+00"
_fmt_float_as(fi, v, bit_size, verb, 'e') _fmt_float_as(fi, v, bit_size, verb, 'e', 6)
case 'h', 'H': case 'h', 'H':
prev_fi := fi^ prev_fi := fi^
+7 -2
View File
@@ -2,6 +2,8 @@ package strconv
import "decimal" import "decimal"
import "core:runtime"
Decimal_Slice :: struct { Decimal_Slice :: struct {
digits: []byte, digits: []byte,
count: int, count: int,
@@ -103,8 +105,11 @@ generic_ftoa :: proc(buf: []byte, val: f64, fmt: byte, precision, bit_size: int)
} }
} else { } else {
switch fmt { switch fmt {
case 'e', 'E': decimal.round(d, prec+1) case 'e', 'E':
case 'f', 'F': decimal.round(d, d.decimal_point+prec) prec += 1
decimal.round(d, prec)
case 'f', 'F':
decimal.round(d, d.decimal_point+prec)
case 'g', 'G': case 'g', 'G':
if prec == 0 { if prec == 0 {
prec = 1 prec = 1