diff --git a/include/fmt/format.h b/include/fmt/format.h index fae4825a..4cb2423d 100644 --- a/include/fmt/format.h +++ b/include/fmt/format.h @@ -1097,6 +1097,9 @@ FMT_CONSTEXPR void handle_float_type_spec(char spec, Handler&& handler) { case 'A': handler.on_hex(); break; + case 'n': + handler.on_num(); + break; default: handler.on_error(); break; @@ -1159,6 +1162,7 @@ class float_type_checker : private ErrorHandler { FMT_CONSTEXPR void on_fixed() {} FMT_CONSTEXPR void on_percent() {} FMT_CONSTEXPR void on_hex() {} + FMT_CONSTEXPR void on_num() {} FMT_CONSTEXPR void on_error() { ErrorHandler::on_error("invalid type specifier"); @@ -2642,9 +2646,14 @@ struct float_spec_handler { bool upper; bool fixed; bool as_percentage; + bool use_locale; explicit float_spec_handler(char t) - : type(t), upper(false), fixed(false), as_percentage(false) {} + : type(t), + upper(false), + fixed(false), + as_percentage(false), + use_locale(false) {} void on_general() { if (type == 'G') upper = true; @@ -2668,6 +2677,8 @@ struct float_spec_handler { if (type == 'A') upper = true; } + void on_num() { use_locale = true; } + FMT_NORETURN void on_error() { FMT_THROW(format_error("invalid type specifier")); } @@ -2728,6 +2739,7 @@ void internal::basic_writer::write_double(T value, } else if (spec.align() == ALIGN_DEFAULT) { as.align_ = ALIGN_RIGHT; } + // TODO: add thousands separators if handler.use_locale is set if (use_grisu) { auto params = internal::gen_digits_params(); params.fixed = handler.fixed; diff --git a/test/format-test.cc b/test/format-test.cc index 2906168f..c3eedcc2 100644 --- a/test/format-test.cc +++ b/test/format-test.cc @@ -1424,7 +1424,7 @@ TEST(FormatterTest, FormatFloat) { } TEST(FormatterTest, FormatDouble) { - check_unknown_types(1.2, "eEfFgGaA%", "double"); + check_unknown_types(1.2, "eEfFgGaAn%", "double"); EXPECT_EQ("0.0", format("{:}", 0.0)); EXPECT_EQ("0.000000", format("{:f}", 0.0)); EXPECT_EQ("0", format("{:g}", 0.0)); @@ -1447,6 +1447,10 @@ TEST(FormatterTest, FormatDouble) { EXPECT_EQ(buffer, format("{:A}", -42.0)); } +TEST(FormatterTest, FormatDoubleLocale) { + EXPECT_EQ("1.23", format("{:n}", 1.23)); +} + TEST(FormatterTest, PrecisionRounding) { EXPECT_EQ("0", format("{:.0f}", 0.0)); EXPECT_EQ("0", format("{:.0f}", 0.01));