Skip to content

Commit 5446da0

Browse files
authored
Merge pull request #1102 from cppalliance/1100
Fix unspecified format precision being 6 digits instead of shortest representation
2 parents 418fd62 + b6c0f26 commit 5446da0

File tree

4 files changed

+38
-22
lines changed

4 files changed

+38
-22
lines changed

include/boost/decimal/fmt_format.hpp

Lines changed: 10 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -36,7 +36,7 @@ template <typename ParseContext>
3636
constexpr auto parse_impl(ParseContext &ctx)
3737
{
3838
auto sign_character = sign_option::minus;
39-
int ctx_precision = 6;
39+
int ctx_precision = -1;
4040
boost::decimal::chars_format fmt = boost::decimal::chars_format::general;
4141
bool is_upper = false;
4242
int padding_digits = 0;
@@ -203,7 +203,15 @@ struct formatter
203203
// LCOV_EXCL_STOP
204204
}
205205

206-
const auto r = boost::decimal::to_chars(buffer_front, buffer.data() + buffer.size(), v, fmt, ctx_precision);
206+
boost::decimal::to_chars_result r {};
207+
if (ctx_precision != -1)
208+
{
209+
r = boost::decimal::to_chars(buffer_front, buffer.data() + buffer.size(), v, fmt, ctx_precision);
210+
}
211+
else
212+
{
213+
r = boost::decimal::to_chars(buffer_front, buffer.data() + buffer.size(), v, fmt);
214+
}
207215

208216
std::string s(buffer.data(), static_cast<std::size_t>(r.ptr - buffer.data()));
209217

include/boost/decimal/format.hpp

Lines changed: 10 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -42,7 +42,7 @@ constexpr auto parse_impl(ParseContext &ctx)
4242
{
4343
auto sign_character = format_sign_option::minus;
4444
auto it {ctx.begin()};
45-
int ctx_precision = 6;
45+
int ctx_precision = -1;
4646
boost::decimal::chars_format fmt = boost::decimal::chars_format::general;
4747
bool is_upper = false;
4848
int padding_digits = 0;
@@ -207,7 +207,15 @@ struct formatter<T>
207207
// LCOV_EXCL_STOP
208208
}
209209

210-
const auto r = to_chars(buffer_front, buffer.data() + buffer.size(), v, fmt, ctx_precision);
210+
boost::decimal::to_chars_result r {};
211+
if (ctx_precision != -1)
212+
{
213+
r = to_chars(buffer_front, buffer.data() + buffer.size(), v, fmt, ctx_precision);
214+
}
215+
else
216+
{
217+
r = to_chars(buffer_front, buffer.data() + buffer.size(), v, fmt);
218+
}
211219

212220
std::string s(buffer.data(), static_cast<std::size_t>(r.ptr - buffer.data()));
213221

test/test_format.cpp

Lines changed: 9 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -84,9 +84,9 @@ void test_general()
8484
template <typename T>
8585
void test_fixed()
8686
{
87-
BOOST_TEST_EQ(std::format("{:f}", T {-21, 6}), "-21000000.000000");
88-
BOOST_TEST_EQ(std::format("{:f}", T {-211, 6}), "-211000000.000000");
89-
BOOST_TEST_EQ(std::format("{:f}", T {-2111, 6}), "-2111000000.000000");
87+
BOOST_TEST_EQ(std::format("{:f}", T {-21, 6}), "-21000000");
88+
BOOST_TEST_EQ(std::format("{:f}", T {-211, 6}), "-211000000");
89+
BOOST_TEST_EQ(std::format("{:f}", T {-2111, 6}), "-2111000000");
9090

9191
BOOST_TEST_EQ(std::format("{:.0f}", T {-21, 6}), std::string{"-21000000"});
9292
BOOST_TEST_EQ(std::format("{:.0f}", T {-211, 6}), std::string{"-211000000"});
@@ -115,13 +115,13 @@ void test_fixed()
115115
template <typename T>
116116
void test_scientific()
117117
{
118-
BOOST_TEST_EQ(std::format("{:e}", T {-21, 6}), "-2.100000e+07");
119-
BOOST_TEST_EQ(std::format("{:e}", T {-211, 6}), "-2.110000e+08");
120-
BOOST_TEST_EQ(std::format("{:e}", T {-2111, 6}), "-2.111000e+09");
118+
BOOST_TEST_EQ(std::format("{:e}", T {-21, 6}), "-2.1e+07");
119+
BOOST_TEST_EQ(std::format("{:e}", T {-211, 6}), "-2.11e+08");
120+
BOOST_TEST_EQ(std::format("{:e}", T {-2111, 6}), "-2.111e+09");
121121

122-
BOOST_TEST_EQ(std::format("{:E}", T {-21, 6}), "-2.100000E+07");
123-
BOOST_TEST_EQ(std::format("{:E}", T {-211, 6}), "-2.110000E+08");
124-
BOOST_TEST_EQ(std::format("{:E}", T {-2111, 6}), "-2.111000E+09");
122+
BOOST_TEST_EQ(std::format("{:E}", T {-21, 6}), "-2.1E+07");
123+
BOOST_TEST_EQ(std::format("{:E}", T {-211, 6}), "-2.11E+08");
124+
BOOST_TEST_EQ(std::format("{:E}", T {-2111, 6}), "-2.111E+09");
125125

126126
BOOST_TEST_EQ(std::format("{:.0E}", T {0}), "0E+00");
127127
BOOST_TEST_EQ(std::format("{:e}", std::numeric_limits<T>::infinity()), "inf");

test/test_format_fmtlib.cpp

Lines changed: 9 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -130,9 +130,9 @@ void test_general()
130130
template <typename T>
131131
void test_fixed()
132132
{
133-
BOOST_TEST_EQ(fmt::format("{:f}", T {21u, 6, true}), "-21000000.000000");
134-
BOOST_TEST_EQ(fmt::format("{:f}", T {211u, 6, true}), "-211000000.000000");
135-
BOOST_TEST_EQ(fmt::format("{:f}", T {2111u, 6, true}), "-2111000000.000000");
133+
BOOST_TEST_EQ(fmt::format("{:f}", T {21u, 6, true}), "-21000000");
134+
BOOST_TEST_EQ(fmt::format("{:f}", T {211u, 6, true}), "-211000000");
135+
BOOST_TEST_EQ(fmt::format("{:f}", T {2111u, 6, true}), "-2111000000");
136136

137137
BOOST_TEST_EQ(fmt::format("{:.0f}", T {21u, 6, true}), std::string{"-21000000"});
138138
BOOST_TEST_EQ(fmt::format("{:.0f}", T {211u, 6, true}), std::string{"-211000000"});
@@ -161,13 +161,13 @@ void test_fixed()
161161
template <typename T>
162162
void test_scientific()
163163
{
164-
BOOST_TEST_EQ(fmt::format("{:e}", T {21u, 6, true}), "-2.100000e+07");
165-
BOOST_TEST_EQ(fmt::format("{:e}", T {211u, 6, true}), "-2.110000e+08");
166-
BOOST_TEST_EQ(fmt::format("{:e}", T {2111u, 6, true}), "-2.111000e+09");
164+
BOOST_TEST_EQ(fmt::format("{:e}", T {21u, 6, true}), "-2.1e+07");
165+
BOOST_TEST_EQ(fmt::format("{:e}", T {211u, 6, true}), "-2.11e+08");
166+
BOOST_TEST_EQ(fmt::format("{:e}", T {2111u, 6, true}), "-2.111e+09");
167167

168-
BOOST_TEST_EQ(fmt::format("{:E}", T {21u, 6, true}), "-2.100000E+07");
169-
BOOST_TEST_EQ(fmt::format("{:E}", T {211u, 6, true}), "-2.110000E+08");
170-
BOOST_TEST_EQ(fmt::format("{:E}", T {2111u, 6, true}), "-2.111000E+09");
168+
BOOST_TEST_EQ(fmt::format("{:E}", T {21u, 6, true}), "-2.1E+07");
169+
BOOST_TEST_EQ(fmt::format("{:E}", T {211u, 6, true}), "-2.11E+08");
170+
BOOST_TEST_EQ(fmt::format("{:E}", T {2111u, 6, true}), "-2.111E+09");
171171

172172
BOOST_TEST_EQ(fmt::format("{:.0E}", T {0}), "0E+00");
173173
BOOST_TEST_EQ(fmt::format("{:e}", std::numeric_limits<T>::infinity()), "inf");

0 commit comments

Comments
 (0)