Skip to content

FloatToStr

Description

Convert a float to a decimal string. Two forms via argument count:

  • FloatToStr(value) - uses value’s allocator.
  • FloatToStr(value, alloc) - uses the explicit allocator.

Success

Returns the freshly built Str.

Failure

Returns an empty Str on allocation failure. Use the FloatTryToStr form when you need explicit failure propagation.

Usage example (Cross-references)

Usage examples (Cross-references)
        Float clone    = FloatClone(&original);
        Float expected = FloatFromStr("-12.5", &alloc.base);
        Str   text     = FloatToStr(&clone);
    
        FloatAbs(&original);
        Str   text = StrInit(&alloc.base);
    
        text = FloatToStr(&f);
    
        bool result = ok && (ZstrCompare(StrBegin(&text), "100") == 0);
        double two_pow_60 = 1152921504606846976.0; // 2^60, exact in f64
        Float  value      = FloatFrom(two_pow_60, &alloc.base);
        Str    text       = FloatToStr(&value);
    
        bool result = (FloatExponent(&value) == 0);
    
        FloatAdd(&r, &a, &b);
        t       = FloatToStr(&r);
        bool ok = ZstrCompare(StrBegin(&t), "100.1") == 0;
    
        FloatAdd(&r, &a, &z);
        t       = FloatToStr(&r);
        bool ok = ZstrCompare(StrBegin(&t), "12.5") == 0;
    
        FloatNegate(&value);
        text = FloatToStr(&value);
    
        bool result = ZstrCompare(StrBegin(&text), "-12.5") == 0;
        StrDeinit(&text);
        FloatAbs(&value);
        text   = FloatToStr(&value);
        result = result && (ZstrCompare(StrBegin(&text), "12.5") == 0);
    
        FloatAdd(&result_value, &a, &b);
        text = FloatToStr(&result_value);
    
        bool result = ZstrCompare(StrBegin(&text), "1.23") == 0;
    
        FloatAdd(&result_value, &a, &b);
        text = FloatToStr(&result_value);
    
        bool result = ZstrCompare(StrBegin(&text), FLOAT_TEST_VERY_LARGE_THREES) == 0;
    
        FloatAdd(&result_value, &a, &b);
        text        = FloatToStr(&result_value);
        bool result = ZstrCompare(StrBegin(&text), "2") == 0;
        StrDeinit(&text);
        FloatAdd(&result_value, &a, &whole);
        text   = FloatToStr(&result_value);
        result = result && (ZstrCompare(StrBegin(&text), "3.25") == 0);
        StrDeinit(&text);
        FloatAdd(&result_value, &a, 2u);
        text   = FloatToStr(&result_value);
        result = result && (ZstrCompare(StrBegin(&text), "3.25") == 0);
        StrDeinit(&text);
        FloatAdd(&result_value, &a, -1);
        text   = FloatToStr(&result_value);
        result = result && (ZstrCompare(StrBegin(&text), "0.25") == 0);
        StrDeinit(&text);
        FloatAdd(&result_value, &a, 0.75f);
        text   = FloatToStr(&result_value);
        result = result && (ZstrCompare(StrBegin(&text), "2") == 0);
        StrDeinit(&text);
        FloatAdd(&result_value, &a, 0.75);
        text   = FloatToStr(&result_value);
        result = result && (ZstrCompare(StrBegin(&text), "2") == 0);
    
        FloatSub(&result_value, &a, &b);
        text = FloatToStr(&result_value);
    
        bool result = ZstrCompare(StrBegin(&text), "-0.5") == 0;
    
        FloatSub(&result_value, &a, &b);
        text = FloatToStr(&result_value);
    
        bool result = ZstrCompare(StrBegin(&text), FLOAT_TEST_VERY_LARGE_TWOS) == 0;
    
        FloatSub(&result_value, &a, &b);
        text        = FloatToStr(&result_value);
        bool result = ZstrCompare(StrBegin(&text), "5") == 0;
        StrDeinit(&text);
        FloatSub(&result_value, &a, &whole);
        text   = FloatToStr(&result_value);
        result = result && (ZstrCompare(StrBegin(&text), "3.5") == 0);
        StrDeinit(&text);
        FloatSub(&result_value, &a, 2u);
        text   = FloatToStr(&result_value);
        result = result && (ZstrCompare(StrBegin(&text), "3.5") == 0);
        StrDeinit(&text);
        FloatSub(&result_value, &a, -2);
        text   = FloatToStr(&result_value);
        result = result && (ZstrCompare(StrBegin(&text), "7.5") == 0);
        StrDeinit(&text);
        FloatSub(&result_value, &a, 0.5f);
        text   = FloatToStr(&result_value);
        result = result && (ZstrCompare(StrBegin(&text), "5") == 0);
    
        FloatMul(&result_value, &a, &b);
        text = FloatToStr(&result_value);
    
        bool result = ZstrCompare(StrBegin(&text), "-2.5") == 0;
    
        FloatMul(&result_value, &a, &b);
        text = FloatToStr(&result_value);
    
        bool result = ZstrCompare(StrBegin(&text), FLOAT_TEST_VERY_LARGE_TWOS) == 0;
    
        FloatMul(&result_value, &a, &b);
        text        = FloatToStr(&result_value);
        bool result = ZstrCompare(StrBegin(&text), "3") == 0;
        StrDeinit(&text);
        FloatMul(&result_value, &a, &whole);
        text   = FloatToStr(&result_value);
        result = result && (ZstrCompare(StrBegin(&text), "3") == 0);
        StrDeinit(&text);
        FloatMul(&result_value, &a, 2u);
        text   = FloatToStr(&result_value);
        result = result && (ZstrCompare(StrBegin(&text), "3") == 0);
        StrDeinit(&text);
        FloatMul(&result_value, &a, -2);
        text   = FloatToStr(&result_value);
        result = result && (ZstrCompare(StrBegin(&text), "-3") == 0);
        StrDeinit(&text);
        FloatMul(&result_value, &a, 0.5f);
        text   = FloatToStr(&result_value);
        result = result && (ZstrCompare(StrBegin(&text), "0.75") == 0);
    
        FloatDiv(&result_value, &a, &b, 3);
        text = FloatToStr(&result_value);
    
        bool result = ZstrCompare(StrBegin(&text), "0.125") == 0;
    
        FloatDiv(&result_value, &a, &b, 0);
        text = FloatToStr(&result_value);
    
        bool result = ZstrCompare(StrBegin(&text), FLOAT_TEST_VERY_LARGE_ONES) == 0;
    
        FloatDiv(&result_value, &a, &b, 1);
        text        = FloatToStr(&result_value);
        bool result = ZstrCompare(StrBegin(&text), "3") == 0;
        StrDeinit(&text);
        FloatDiv(&result_value, &a, &whole, 1);
        text   = FloatToStr(&result_value);
        result = result && (ZstrCompare(StrBegin(&text), "2.5") == 0);
        StrDeinit(&text);
        FloatDiv(&result_value, &a, 3u, 1);
        text   = FloatToStr(&result_value);
        result = result && (ZstrCompare(StrBegin(&text), "2.5") == 0);
        StrDeinit(&text);
        FloatDiv(&result_value, &a, -3, 1);
        text   = FloatToStr(&result_value);
        result = result && (ZstrCompare(StrBegin(&text), "-2.5") == 0);
        StrDeinit(&text);
        FloatDiv(&result_value, &a, 0.5f, 1);
        text   = FloatToStr(&result_value);
        result = result && (ZstrCompare(StrBegin(&text), "15") == 0);
        StrDeinit(&text);
        FloatDiv(&result_value, &a, 0.5, 1);
        text   = FloatToStr(&result_value);
        result = result && (ZstrCompare(StrBegin(&text), "15") == 0);
    
        FloatAdd(&result_value, &a, &b);
        text = FloatToStr(&result_value);
    
        bool result = ZstrCompare(StrBegin(&text), "3") == 0;
    
        FloatAdd(&result_value, &a, &b);
        text = FloatToStr(&result_value);
    
        bool result = ZstrCompare(StrBegin(&text), "-3") == 0;
    
        FloatAdd(&result_value, &a, &b);
        text = FloatToStr(&result_value);
    
        bool result = ZstrCompare(StrBegin(&text), "0.75") == 0;
        Str   text = StrInit(&alloc.base);
    
        text = FloatToStr(&f);
    
        bool result = ok && (ZstrCompare(StrBegin(&text), "5") == 0);
        Str   text = StrInit(&alloc.base);
    
        text = FloatToStr(&f);
    
        bool result = ok && (ZstrCompare(StrBegin(&text), "19") == 0);
    
        bool ok     = FloatDiv(&quotient, &a, &b, 8);
        text        = FloatToStr(&quotient);
        bool result = ok && (ZstrCompare(StrBegin(&text), "2") == 0);
    
        bool ok = FloatDiv(&r, &a, 3u, 1);
        text    = FloatToStr(&r);
        ok      = ok && (ZstrCompare(StrBegin(&text), "2.5") == 0);
    
        Float value = float_from_u64(42, ALLOCATOR_OF(&alloc));
        Str   text  = FloatToStr(&value);
    
        bool result = ZstrCompare(StrBegin(&text), "42") == 0;
    
        Float value = float_from_i64(-42, ALLOCATOR_OF(&alloc));
        Str   text  = FloatToStr(&value);
    
        bool result = ZstrCompare(StrBegin(&text), "-42") == 0;
        Int   integer = IntFromStr("12345678901234567890", ALLOCATOR_OF(&alloc));
        Float value   = float_from_int(&integer, ALLOCATOR_OF(&alloc));
        Str   text    = FloatToStr(&value);
    
        bool result = ZstrCompare(StrBegin(&text), "12345678901234567890") == 0;
    
        Float value = FloatFromStr("-123.45", ALLOCATOR_OF(&alloc));
        Str   text  = FloatToStr(&value);
    
        bool result = ZstrCompare(StrBegin(&text), "-123.45") == 0;
    
        Float value = FloatFromStr(FLOAT_TEST_VERY_LARGE_ONES, ALLOCATOR_OF(&alloc));
        Str   text  = FloatToStr(&value);
    
        bool result = ZstrCompare(StrBegin(&text), FLOAT_TEST_VERY_LARGE_ONES) == 0;
    
        Float value = FloatFromStr("1.2300e3", ALLOCATOR_OF(&alloc));
        Str   text  = FloatToStr(&value);
    
        bool result = ZstrCompare(StrBegin(&text), "1230") == 0;
        Int   whole = IntFrom(100, &alloc.base);
        Float value = FloatFrom(&whole, &alloc.base);
        Str   text  = FloatToStr(&value);
    
        bool result = ZstrCompare(StrBegin(&text), "100") == 0;
    
        FloatNegate(&value);
        Str text = FloatToStr(&value);
    
        result = result && FloatIsNegative(&value);
    
        Float value = FloatFrom((u64)100, &alloc.base);
        Str   text  = FloatToStr(&value);
        bool  ok    = ZstrCompare(StrBegin(&text), "100") == 0;
        bool  ok    = FloatTryFromStr(&value, &text);
    
        Str printed = FloatToStr(&value);
        ok          = ok && (ZstrCompare(StrBegin(&printed), "3.14") == 0);
    // trailing garbage even if it stringifies as a terminator.
    static bool test_m6_to_str_neg_exp_split(void) {
        WriteFmt("Testing FloatToStr fractional loop bound for 3.14\n");
    
        DefaultAllocator alloc = DefaultAllocatorInit();
    
        Float value = FloatFromStr("3.14", &alloc.base);
        Str   text  = FloatToStr(&value);
    
        bool result = (ZstrCompare(StrBegin(&text), "3.14") == 0) && (StrLen(&text) == 4);
    // terminates. Asserting exact text and length 5 catches all three.
    static bool test_m6_to_str_leading_zeros(void) {
        WriteFmt("Testing FloatToStr leading-zero loop for 0.001\n");
    
        DefaultAllocator alloc = DefaultAllocatorInit();
    
        Float value = FloatFromStr("0.001", &alloc.base);
        Str   text  = FloatToStr(&value);
    
        bool result = (ZstrCompare(StrBegin(&text), "0.001") == 0) && (StrLen(&text) == 5);
    // trailing zeros exactly. Guards the positive-exponent path of float_try_to_str.
    static bool test_m6_to_str_positive_exp(void) {
        WriteFmt("Testing FloatToStr positive-exponent trailing zeros for 100\n");
    
        DefaultAllocator alloc = DefaultAllocatorInit();
        // 1e2 keeps significand 1 with exponent 2, exercising the >= 0 zero loop.
        Float value = FloatFromStr("1e2", &alloc.base);
        Str   text  = FloatToStr(&value);
    
        bool result = (ZstrCompare(StrBegin(&text), "100") == 0) && (StrLen(&text) == 3);
        bool  ok    = FloatTryFromStr(&value, "1.");
    
        Str text = FloatToStr(&value);
        ok       = ok && (ZstrCompare(StrBegin(&text), "1") == 0);
    
        Float value = FloatFrom(4503599627370496.0, &alloc.base);
        Str   text  = FloatToStr(&value);
    
        bool result = (ZstrCompare(StrBegin(&text), "4503599627370496") == 0) && (StrLen(&text) == 16);
        StrReadFmt(input, "{}", f);
    
        Str  text = FloatToStr(&f);
        bool ok   = (ZstrCompare(StrBegin(&text), expected) == 0);
        success = success && (ZstrLen(z) == 0);
    
        Str text = FloatToStr(&val);
        success  = success && (ZstrCompare(StrBegin(&text), "3.5") == 0);
        StrDeinit(&text);
        success = success && (ZstrLen(z) == 0);
    
        Str text = FloatToStr(&val);
        success  = success && (ZstrCompare(StrBegin(&text), "12.25") == 0);
        StrDeinit(&text);
    
        // 1.5e2 == 150
        Str text = FloatToStr(&val);
        success  = success && (ZstrCompare(StrBegin(&text), "150") == 0);
        StrDeinit(&text);
        success = success && (ZstrLen(z) == 0);
    
        Str text = FloatToStr(&val);
        success  = success && (ZstrCompare(StrBegin(&text), "-0.25") == 0);
        StrDeinit(&text);
        z = "1234567890.012345";
        StrReadFmt(z, "{}", dec);
        dec_text = FloatToStr(&dec);
        success  = success && (ZstrCompare(StrBegin(&dec_text), "1234567890.012345") == 0);
        z = "1.234567e+04";
        StrReadFmt(z, "{e}", sci);
        sci_text = FloatToStr(&sci);
        success  = success && (ZstrCompare(StrBegin(&sci_text), "12345.67") == 0);
        z = "-0.00125";
        StrReadFmt(z, "{}", neg);
        neg_text = FloatToStr(&neg);
        success  = success && (ZstrCompare(StrBegin(&neg_text), "-0.00125") == 0);
        (void)FloatTryFromStr(&f, "99"); // sentinel
        StrReadFmt(in, "{}", f);
        Str  t  = FloatToStr(&f);
        bool ok = (ZstrCompare(StrBegin(&t), expect) == 0);
        StrDeinit(&t);
        Zstr           z   = "3.14159";
        StrReadFmt(z, "{}", f);
        Str  t  = FloatToStr(&f);
        bool ok = (ZstrCompare(StrBegin(&t), "3.14159") == 0);
        StrDeinit(&t);
        Zstr z   = "xyz"; // no float token
        Zstr out = str_read_fmt(z, "{}", (TypeSpecificIO[]) {TO_TYPE_SPECIFIC_IO(Float, &f)}, 1);
        Str  t   = FloatToStr(&f);
        bool ok  = (out == NULL) && (ZstrCompare(StrBegin(&t), "42") == 0);
        StrDeinit(&t);
Last updated on