diff --git a/AK/PrintfImplementation.h b/AK/PrintfImplementation.h index cab0e735b5..b46fff6c1a 100644 --- a/AK/PrintfImplementation.h +++ b/AK/PrintfImplementation.h @@ -178,7 +178,7 @@ template } template -[[gnu::always_inline]] inline int print_double(PutChFunc putch, char*& bufptr, double number, bool leftPad, bool zeroPad, u32 fieldWidth) +[[gnu::always_inline]] inline int print_double(PutChFunc putch, char*& bufptr, double number, bool leftPad, bool zeroPad, u32 fieldWidth, u32 fraction_length = 6) { int length = 0; @@ -192,9 +192,11 @@ template putch(bufptr, '.'); length++; double fraction = number - (i64)number; - // FIXME: Allow other fractions - fraction = fraction * 1000000; - return length + print_u64(putch, bufptr, (i64)fraction, leftPad, true, 6); + + for (u32 i = 0; i < fraction_length; ++i) + fraction = fraction * 10; + + return length + print_u64(putch, bufptr, (i64)fraction, false, true, fraction_length); } template @@ -295,6 +297,7 @@ template bool zeroPad = false; bool dot = false; unsigned fieldWidth = 0; + unsigned fraction_length = 0; unsigned long_qualifiers = 0; bool size_qualifier = false; (void)size_qualifier; @@ -324,10 +327,17 @@ template goto one_more; } if (*p >= '0' && *p <= '9') { - fieldWidth *= 10; - fieldWidth += *p - '0'; - if (*(p + 1)) - goto one_more; + if (!dot) { + fieldWidth *= 10; + fieldWidth += *p - '0'; + if (*(p + 1)) + goto one_more; + } else { + fraction_length *= 10; + fraction_length += *p - '0'; + if (*(p + 1)) + goto one_more; + } } if (*p == '*') { fieldWidth = va_arg(ap, int); @@ -381,7 +391,7 @@ template #if !defined(BOOTSTRAPPER) && !defined(KERNEL) case 'g': case 'f': - ret += print_double(putch, bufptr, va_arg(ap, double), left_pad, zeroPad, fieldWidth); + ret += print_double(putch, bufptr, va_arg(ap, double), left_pad, zeroPad, fieldWidth, fraction_length); break; #endif diff --git a/Libraries/LibGUI/Variant.cpp b/Libraries/LibGUI/Variant.cpp index 73fe3cac89..09c6f583be 100644 --- a/Libraries/LibGUI/Variant.cpp +++ b/Libraries/LibGUI/Variant.cpp @@ -398,7 +398,7 @@ String Variant::to_string() const case Type::UnsignedInt: return String::number(as_uint()); case Type::Float: - return String::format("%f", (double)as_float()); + return String::format("%.2f", (double)as_float()); case Type::String: return as_string(); case Type::Bitmap: