21template <
typename Float>
22bool Writer::FormatScientificText(Float value, uint8_t precision,
bool alternate,
23 bool upper_case,
char* out,
size_t& out_size)
25 auto rounded = RoundScientificDigits(value, precision);
26 Float rounded_digits = rounded.digits;
27 Float digit_scale = rounded.scale;
30 if (!AppendBufferChar(
31 out, float_buffer_capacity, out_size,
32 static_cast<char>(
'0' + ExtractDigit(rounded_digits, digit_scale))))
37 if (precision != 0 || alternate)
39 if (!AppendBufferChar(out, float_buffer_capacity, out_size,
'.'))
46 for (uint8_t i = 0; i < precision; ++i)
48 if (!AppendBufferChar(
49 out, float_buffer_capacity, out_size,
50 static_cast<char>(
'0' + ExtractDigit(rounded_digits, digit_scale))))
57 return AppendExponentText(out, out_size, rounded.exponent, upper_case);
72template <
typename Float>
73bool Writer::FormatFloatText(FormatType type,
const Spec& spec, Float value,
char* out,
78 if (std::isnan(value))
80 return AppendBufferText(out, float_buffer_capacity, out_size,
81 spec.UpperCase() ?
"NAN" :
"nan");
83 if (std::isinf(value))
85 return AppendBufferText(out, float_buffer_capacity, out_size,
86 spec.UpperCase() ?
"INF" :
"inf");
89 uint8_t precision = spec.HasPrecision() ? spec.precision : DefaultFloatPrecision();
92 case FormatType::FloatFixed:
93 case FormatType::DoubleFixed:
94 case FormatType::LongDoubleFixed:
95 if (ExceedsFixedIntegerDigits(value, precision))
99 return FormatFixedText(value, precision, spec.Alternate(), out, out_size);
100 case FormatType::FloatScientific:
101 case FormatType::DoubleScientific:
102 case FormatType::LongDoubleScientific:
103 return FormatScientificText(value, precision, spec.Alternate(), spec.UpperCase(),
105 case FormatType::FloatGeneral:
106 case FormatType::DoubleGeneral:
107 case FormatType::LongDoubleGeneral:
109 uint8_t significant = precision == 0 ? 1 : precision;
115 RoundScientificDigits(value,
static_cast<uint8_t
>(significant - 1)).exponent;
116 if (exponent < -4 || exponent >= significant)
118 if (!FormatScientificText(value,
static_cast<uint8_t
>(significant - 1),
119 spec.Alternate(), spec.UpperCase(), out, out_size))
126 int fractional_precision =
static_cast<int>(significant) - (exponent + 1);
127 if (fractional_precision < 0)
129 fractional_precision = 0;
131 if (ExceedsFixedIntegerDigits(value,
static_cast<uint8_t
>(fractional_precision)))
135 if (!FormatFixedText(value,
static_cast<uint8_t
>(fractional_precision),
136 spec.Alternate(), out, out_size))
142 if (!spec.Alternate())
144 out_size = TrimGeneralText(out, out_size);