truncation instead of rounding
This commit is contained in:
parent
4d38a66f96
commit
f8b9e79504
@ -1151,47 +1151,19 @@ void write_fractional_seconds(OutputIt& out, Duration d, int precision = -1) {
|
|||||||
out = std::fill_n(out, leading_zeroes, '0');
|
out = std::fill_n(out, leading_zeroes, '0');
|
||||||
out = format_decimal<Char>(out, n, num_digits).end;
|
out = format_decimal<Char>(out, n, num_digits).end;
|
||||||
}
|
}
|
||||||
} else {
|
} else if (precision > 0) {
|
||||||
*out++ = '.';
|
*out++ = '.';
|
||||||
leading_zeroes = (std::min)(leading_zeroes, precision);
|
leading_zeroes = (std::min)(leading_zeroes, precision);
|
||||||
int remaining = precision - leading_zeroes;
|
int remaining = precision - leading_zeroes;
|
||||||
|
out = std::fill_n(out, leading_zeroes, '0');
|
||||||
if (remaining < num_digits) {
|
if (remaining < num_digits) {
|
||||||
int num_truncated_digits = num_digits - remaining;
|
int num_truncated_digits = num_digits - remaining;
|
||||||
n /= to_unsigned(detail::pow10(to_unsigned(num_truncated_digits) - 1));
|
n /= to_unsigned(detail::pow10(to_unsigned(num_truncated_digits)));
|
||||||
const int old_num_digits = detail::count_digits(n);
|
|
||||||
auto roundingDigit = n % 10;
|
|
||||||
n /= 10;
|
|
||||||
if (n) {
|
if (n) {
|
||||||
if (roundingDigit > 5 || (roundingDigit == 5 && n % 10 % 2 != 0)) {
|
out = format_decimal<Char>(out, n, remaining).end;
|
||||||
n += 1;
|
|
||||||
}
|
|
||||||
if (old_num_digits == detail::count_digits(n)) {
|
|
||||||
if (leading_zeroes) {
|
|
||||||
out = std::fill_n(out, leading_zeroes - 1, '0');
|
|
||||||
*out++ = '1';
|
|
||||||
out = std::fill_n(out, remaining, '0');
|
|
||||||
} else {
|
|
||||||
n -= 1;
|
|
||||||
out = format_decimal<Char>(out, n, remaining).end;
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
out = std::fill_n(out, leading_zeroes, '0');
|
|
||||||
out = format_decimal<Char>(out, n, remaining).end;
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
if (roundingDigit >= 5) {
|
|
||||||
if (leading_zeroes) {
|
|
||||||
out = std::fill_n(out, leading_zeroes - 1, '0');
|
|
||||||
*out++ = '1';
|
|
||||||
out = std::fill_n(out, remaining, '0');
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
out = std::fill_n(out, leading_zeroes, '0');
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
out = std::fill_n(out, leading_zeroes, '0');
|
|
||||||
if (n) {
|
if (n) {
|
||||||
out = format_decimal<Char>(out, n, num_digits).end;
|
out = format_decimal<Char>(out, n, num_digits).end;
|
||||||
remaining -= num_digits;
|
remaining -= num_digits;
|
||||||
|
|||||||
@ -794,13 +794,11 @@ TEST(chrono_test, cpp20_duration_subsecond_support) {
|
|||||||
EXPECT_EQ(fmt::format("{:.2%S}", std::chrono::milliseconds{12345}),
|
EXPECT_EQ(fmt::format("{:.2%S}", std::chrono::milliseconds{12345}),
|
||||||
"12.34");
|
"12.34");
|
||||||
EXPECT_EQ(fmt::format("{:.2%S}", std::chrono::milliseconds{12375}),
|
EXPECT_EQ(fmt::format("{:.2%S}", std::chrono::milliseconds{12375}),
|
||||||
"12.38");
|
"12.37");
|
||||||
EXPECT_EQ(fmt::format("{:.2%S}", std::chrono::milliseconds{-12375}),
|
EXPECT_EQ(fmt::format("{:.2%S}", std::chrono::milliseconds{-12375}),
|
||||||
"-12.38");
|
"-12.37");
|
||||||
EXPECT_EQ(fmt::format("{:.2%S}", std::chrono::milliseconds{12054}),
|
EXPECT_EQ(fmt::format("{:.0%S}", std::chrono::milliseconds{12054}),
|
||||||
"12.05");
|
"12");
|
||||||
EXPECT_EQ(fmt::format("{:.1%S}", std::chrono::milliseconds{12054}),
|
|
||||||
"12.1");
|
|
||||||
EXPECT_EQ(fmt::format("{:.2%S}", std::chrono::milliseconds{99999}),
|
EXPECT_EQ(fmt::format("{:.2%S}", std::chrono::milliseconds{99999}),
|
||||||
"39.99");
|
"39.99");
|
||||||
EXPECT_EQ(fmt::format("{:.2%S}", std::chrono::milliseconds{1000}),
|
EXPECT_EQ(fmt::format("{:.2%S}", std::chrono::milliseconds{1000}),
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user