From 25c492ee19421cc4e095c5da42fbb5439905783b Mon Sep 17 00:00:00 2001 From: Nicolas Boichat Date: Sun, 16 Mar 2025 20:10:18 +0100 Subject: [PATCH] uucore: format: Pad non-finite numbers with spaces, not zeros `printf "%05.2f" inf` should print ` inf`, not `00inf`. Add a test to cover that case, too. --- .../src/lib/features/format/num_format.rs | 12 ++++++++++-- tests/by-util/test_printf.rs | 17 +++++++++++++++++ 2 files changed, 27 insertions(+), 2 deletions(-) diff --git a/src/uucore/src/lib/features/format/num_format.rs b/src/uucore/src/lib/features/format/num_format.rs index bcac0d737..3a22fe044 100644 --- a/src/uucore/src/lib/features/format/num_format.rs +++ b/src/uucore/src/lib/features/format/num_format.rs @@ -253,6 +253,8 @@ impl Formatter<&ExtendedBigDecimal> for Float { ExtendedBigDecimal::MinusNan => (ExtendedBigDecimal::Nan, true), }; + let mut alignment = self.alignment; + let s = match abs { ExtendedBigDecimal::BigDecimal(bd) => match self.variant { FloatVariant::Decimal => { @@ -268,11 +270,17 @@ impl Formatter<&ExtendedBigDecimal> for Float { format_float_hexadecimal(&bd, self.precision, self.case, self.force_decimal) } }, - _ => format_float_non_finite(&abs, self.case), + _ => { + // Pad non-finite numbers with spaces, not zeros. + if alignment == NumberAlignment::RightZero { + alignment = NumberAlignment::RightSpace; + }; + format_float_non_finite(&abs, self.case) + } }; let sign_indicator = get_sign_indicator(self.positive_sign, negative); - write_output(writer, sign_indicator, s, self.width, self.alignment) + write_output(writer, sign_indicator, s, self.width, alignment) } fn try_from_spec(s: Spec) -> Result diff --git a/tests/by-util/test_printf.rs b/tests/by-util/test_printf.rs index f33959ea0..9597d1130 100644 --- a/tests/by-util/test_printf.rs +++ b/tests/by-util/test_printf.rs @@ -990,6 +990,23 @@ fn float_flag_position_space_padding() { .stdout_only(" +1.0"); } +#[test] +fn float_non_finite_space_padding() { + new_ucmd!() + .args(&["% 5.2f|% 5.2f|% 5.2f|% 5.2f", "inf", "-inf", "nan", "-nan"]) + .succeeds() + .stdout_only(" inf| -inf| nan| -nan"); +} + +#[test] +fn float_non_finite_zero_padding() { + // Zero-padding pads non-finite numbers with spaces. + new_ucmd!() + .args(&["%05.2f|%05.2f|%05.2f|%05.2f", "inf", "-inf", "nan", "-nan"]) + .succeeds() + .stdout_only(" inf| -inf| nan| -nan"); +} + #[test] fn float_abs_value_less_than_one() { new_ucmd!()