diff --git a/src/uucore/src/lib/features/format/num_format.rs b/src/uucore/src/lib/features/format/num_format.rs index ea5d6a75316..607c028c32c 100644 --- a/src/uucore/src/lib/features/format/num_format.rs +++ b/src/uucore/src/lib/features/format/num_format.rs @@ -156,13 +156,21 @@ impl Formatter for UnsignedInt { format!("{x:x}") } UnsignedIntVariant::Hexadecimal(Case::Lowercase, Prefix::Yes) => { - format!("{x:#x}") + if x == 0 { + "0".to_string() + } else { + format!("{x:#x}") + } } UnsignedIntVariant::Hexadecimal(Case::Uppercase, Prefix::No) => { format!("{x:X}") } UnsignedIntVariant::Hexadecimal(Case::Uppercase, Prefix::Yes) => { - format!("{x:#X}") + if x == 0 { + "0".to_string() + } else { + format!("{x:#X}") + } } }; diff --git a/tests/by-util/test_printf.rs b/tests/by-util/test_printf.rs index 411285a0cd2..db4c5aa7f8d 100644 --- a/tests/by-util/test_printf.rs +++ b/tests/by-util/test_printf.rs @@ -645,6 +645,32 @@ fn partial_char() { ); } +#[test] +fn sub_alternative_lower_hex_0() { + new_ucmd!().args(&["%#x", "0"]).succeeds().stdout_only("0"); +} + +#[test] +fn sub_alternative_lower_hex() { + new_ucmd!() + .args(&["%#x", "42"]) + .succeeds() + .stdout_only("0x2a"); +} + +#[test] +fn sub_alternative_upper_hex_0() { + new_ucmd!().args(&["%#X", "0"]).succeeds().stdout_only("0"); +} + +#[test] +fn sub_alternative_upper_hex() { + new_ucmd!() + .args(&["%#X", "42"]) + .succeeds() + .stdout_only("0x2A"); +} + #[test] fn char_as_byte() { new_ucmd!().args(&["%c", "🙃"]).succeeds().stdout_only("ð");