From eff153f32b6cd11ca91b5d964b107c464de53c8c Mon Sep 17 00:00:00 2001 From: Christopher Dryden Date: Fri, 9 Jan 2026 15:52:49 +0000 Subject: [PATCH] numfmt: support empty delimiter to treat line as single field --- src/uu/numfmt/src/format.rs | 16 ++++++++++++++++ tests/by-util/test_numfmt.rs | 9 +++++++++ 2 files changed, 25 insertions(+) diff --git a/src/uu/numfmt/src/format.rs b/src/uu/numfmt/src/format.rs index f27926d8744..dab77521896 100644 --- a/src/uu/numfmt/src/format.rs +++ b/src/uu/numfmt/src/format.rs @@ -381,6 +381,22 @@ pub fn format_and_print_delimited(input: &[u8], options: &NumfmtOptions) -> Resu b'\n' }; + // Empty delimiter means treat entire line as single field + if delimiter.is_empty() { + if uucore::ranges::contain(&options.fields, 1) { + let input_str = std::str::from_utf8(input) + .map_err(|_| translate!("numfmt-error-invalid-number", "input" => String::from_utf8_lossy(input).into_owned().quote()))? + .trim_start(); + let formatted = format_string(input_str, options, None)?; + output.extend_from_slice(formatted.as_bytes()); + } else { + output.extend_from_slice(input); + } + output.push(eol); + std::io::Write::write_all(&mut std::io::stdout(), &output).map_err(|e| e.to_string())?; + return Ok(()); + } + for (n, field) in (1..).zip(split_bytes(input, delimiter)) { let field_selected = uucore::ranges::contain(&options.fields, n); diff --git a/tests/by-util/test_numfmt.rs b/tests/by-util/test_numfmt.rs index 241286d07c6..928dfd639d5 100644 --- a/tests/by-util/test_numfmt.rs +++ b/tests/by-util/test_numfmt.rs @@ -1147,3 +1147,12 @@ fn test_unit_separator() { new_ucmd!().args(args).succeeds().stdout_only(expected); } } + +#[test] +fn test_empty_delimiter() { + // Empty delimiter treats entire line as single field + new_ucmd!() + .args(&["-d", "", "--from=auto", "40M"]) + .succeeds() + .stdout_only("40000000\n"); +}