mirror of
https://github.com/Ed94/Odin.git
synced 2026-08-04 22:58:46 +00:00
Fix %g in fmt, and make %v default to %g for floats
This commit is contained in:
+12
-6
@@ -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^
|
||||||
|
|||||||
@@ -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
|
||||||
|
|||||||
Reference in New Issue
Block a user