Skip to content

Commit 1f1d7cf

Browse files
committed
FFstrbuf: handles double rounding and zero representation in formatter
1 parent 26253f8 commit 1f1d7cf

File tree

2 files changed

+24
-4
lines changed

2 files changed

+24
-4
lines changed

src/util/FFstrbuf.c

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@
22

33
#include <ctype.h>
44
#include <inttypes.h>
5+
#include <math.h>
56

67
char* CHAR_NULL_PTR = "";
78

@@ -577,9 +578,12 @@ void ffStrbufAppendDouble(FFstrbuf* strbuf, double value, int8_t precision)
577578
ffStrbufEnsureFree(strbuf, 40); // Required by yyjson_write_number
578579
char* start = strbuf->chars + strbuf->length;
579580

581+
if (precision == 0)
582+
value = round(value);
580583
yyjson_val val = {};
581584
unsafe_yyjson_set_double(&val, value);
582-
if (precision >= 0) unsafe_yyjson_set_fp_to_fixed(&val, precision == 0 ? 1 : precision); // yyjson ignores precision == 0
585+
if (precision > 0)
586+
unsafe_yyjson_set_fp_to_fixed(&val, precision);
583587

584588
// Write at most <precision> digits after the decimal point; doesn't append trailing zeros
585589
char* end = yyjson_write_number(&val, start);

tests/strbuf.c

Lines changed: 19 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -759,6 +759,14 @@ int main(void)
759759
ffStrbufAppendDouble(&strbuf, 120.123456789, 5);
760760
VERIFY(ffStrbufEqualS(&strbuf, "120.12346"));
761761

762+
ffStrbufClear(&strbuf);
763+
ffStrbufAppendDouble(&strbuf, 120.888888, 0);
764+
VERIFY(ffStrbufEqualS(&strbuf, "121"));
765+
766+
ffStrbufClear(&strbuf);
767+
ffStrbufAppendDouble(&strbuf, 120.999999, 2);
768+
VERIFY(ffStrbufEqualS(&strbuf, "121.00"));
769+
762770
ffStrbufClear(&strbuf);
763771
ffStrbufAppendDouble(&strbuf, 120.123456789, 0);
764772
VERIFY(ffStrbufEqualS(&strbuf, "120"));
@@ -799,6 +807,14 @@ int main(void)
799807
ffStrbufAppendDouble(&strbuf, -120.123, 5);
800808
VERIFY(ffStrbufEqualS(&strbuf, "-120.12300"));
801809

810+
ffStrbufClear(&strbuf);
811+
ffStrbufAppendDouble(&strbuf, -120.888888, 0);
812+
VERIFY(ffStrbufEqualS(&strbuf, "-121"));
813+
814+
ffStrbufClear(&strbuf);
815+
ffStrbufAppendDouble(&strbuf, -120.999999, 2);
816+
VERIFY(ffStrbufEqualS(&strbuf, "-121.00"));
817+
802818
ffStrbufClear(&strbuf);
803819
ffStrbufAppendDouble(&strbuf, 1.2345e50, 1);
804820
VERIFY(ffStrbufEqualS(&strbuf, "1.2345e50"));
@@ -832,12 +848,12 @@ int main(void)
832848
VERIFY(ffStrbufEqualS(&strbuf, "-123450000000000000000.0"));
833849

834850
ffStrbufClear(&strbuf);
835-
ffStrbufAppendDouble(&strbuf, 0, 0);
851+
ffStrbufAppendDouble(&strbuf, +0.0, 0);
836852
VERIFY(ffStrbufEqualS(&strbuf, "0"));
837853

838854
ffStrbufClear(&strbuf);
839-
ffStrbufAppendDouble(&strbuf, -0, 0);
840-
VERIFY(ffStrbufEqualS(&strbuf, "0"));
855+
ffStrbufAppendDouble(&strbuf, -0.0, 0);
856+
VERIFY(ffStrbufEqualS(&strbuf, "-0"));
841857

842858
ffStrbufDestroy(&strbuf);
843859
}

0 commit comments

Comments
 (0)