1
Fork 0
mirror of https://github.com/RGBCube/uutils-coreutils synced 2025-07-27 11:07:44 +00:00

Merge pull request #7322 from alexsnaps/issue-7221

numfmt: fix Unit::SI uses lowercase `k` suffix for kilos
This commit is contained in:
Sylvestre Ledru 2025-02-24 19:28:00 +01:00 committed by GitHub
commit 81048228cf
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
5 changed files with 63 additions and 62 deletions

View file

@ -278,12 +278,12 @@ fn transform_to(
format!(
"{:.precision$}{}",
i2,
DisplayableSuffix(s),
DisplayableSuffix(s, opts.to),
precision = precision
)
}
Some(s) if i2.abs() < 10.0 => format!("{:.1}{}", i2, DisplayableSuffix(s)),
Some(s) => format!("{:.0}{}", i2, DisplayableSuffix(s)),
Some(s) if i2.abs() < 10.0 => format!("{:.1}{}", i2, DisplayableSuffix(s, opts.to)),
Some(s) => format!("{:.0}{}", i2, DisplayableSuffix(s, opts.to)),
})
}

View file

@ -45,20 +45,21 @@ pub enum RawSuffix {
pub type Suffix = (RawSuffix, WithI);
pub struct DisplayableSuffix(pub Suffix);
pub struct DisplayableSuffix(pub Suffix, pub Unit);
impl fmt::Display for DisplayableSuffix {
fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
let Self((ref raw_suffix, ref with_i)) = *self;
match raw_suffix {
RawSuffix::K => write!(f, "K"),
RawSuffix::M => write!(f, "M"),
RawSuffix::G => write!(f, "G"),
RawSuffix::T => write!(f, "T"),
RawSuffix::P => write!(f, "P"),
RawSuffix::E => write!(f, "E"),
RawSuffix::Z => write!(f, "Z"),
RawSuffix::Y => write!(f, "Y"),
let Self((ref raw_suffix, ref with_i), unit) = *self;
match (raw_suffix, unit) {
(RawSuffix::K, Unit::Si) => write!(f, "k"),
(RawSuffix::K, _) => write!(f, "K"),
(RawSuffix::M, _) => write!(f, "M"),
(RawSuffix::G, _) => write!(f, "G"),
(RawSuffix::T, _) => write!(f, "T"),
(RawSuffix::P, _) => write!(f, "P"),
(RawSuffix::E, _) => write!(f, "E"),
(RawSuffix::Z, _) => write!(f, "Z"),
(RawSuffix::Y, _) => write!(f, "Y"),
}
.and_then(|()| match with_i {
true => write!(f, "i"),

View file

@ -86,7 +86,7 @@ fn test_to_si() {
.args(&["--to=si"])
.pipe_in("1000\n1100000\n100000000")
.succeeds()
.stdout_is("1.0K\n1.1M\n100M\n");
.stdout_is("1.0k\n1.1M\n100M\n");
}
#[test]
@ -245,15 +245,15 @@ fn test_suffixes() {
// TODO add support for ronna (R) and quetta (Q)
let valid_suffixes = ['K', 'M', 'G', 'T', 'P', 'E', 'Z', 'Y' /*'R' , 'Q'*/];
// TODO implement special handling of 'K'
for c in ('A'..='Z').chain('a'..='z') {
let args = ["--from=si", "--to=si", &format!("1{c}")];
if valid_suffixes.contains(&c) {
let s = if c == 'K' { 'k' } else { c };
new_ucmd!()
.args(&args)
.succeeds()
.stdout_only(format!("1.0{c}\n"));
.stdout_only(format!("1.0{s}\n"));
} else {
new_ucmd!()
.args(&args)
@ -506,7 +506,7 @@ fn test_delimiter_to_si() {
.args(&["-d=,", "--to=si"])
.pipe_in("1234,56")
.succeeds()
.stdout_only("1.3K,56\n");
.stdout_only("1.3k,56\n");
}
#[test]
@ -515,7 +515,7 @@ fn test_delimiter_skips_leading_whitespace() {
.args(&["-d=,", "--to=si"])
.pipe_in(" \t 1234,56")
.succeeds()
.stdout_only("1.3K,56\n");
.stdout_only("1.3k,56\n");
}
#[test]
@ -524,7 +524,7 @@ fn test_delimiter_preserves_leading_whitespace_in_unselected_fields() {
.args(&["-d=|", "--to=si"])
.pipe_in(" 1000| 2000")
.succeeds()
.stdout_only("1.0K| 2000\n");
.stdout_only("1.0k| 2000\n");
}
#[test]
@ -552,7 +552,7 @@ fn test_delimiter_with_padding() {
.args(&["-d=|", "--to=si", "--padding=5"])
.pipe_in("1000|2000")
.succeeds()
.stdout_only(" 1.0K|2000\n");
.stdout_only(" 1.0k|2000\n");
}
#[test]
@ -561,21 +561,21 @@ fn test_delimiter_with_padding_and_fields() {
.args(&["-d=|", "--to=si", "--padding=5", "--field=-"])
.pipe_in("1000|2000")
.succeeds()
.stdout_only(" 1.0K| 2.0K\n");
.stdout_only(" 1.0k| 2.0k\n");
}
#[test]
fn test_round() {
for (method, exp) in [
("from-zero", ["9.1K", "-9.1K", "9.1K", "-9.1K"]),
("from-zer", ["9.1K", "-9.1K", "9.1K", "-9.1K"]),
("f", ["9.1K", "-9.1K", "9.1K", "-9.1K"]),
("towards-zero", ["9.0K", "-9.0K", "9.0K", "-9.0K"]),
("up", ["9.1K", "-9.0K", "9.1K", "-9.0K"]),
("down", ["9.0K", "-9.1K", "9.0K", "-9.1K"]),
("nearest", ["9.0K", "-9.0K", "9.1K", "-9.1K"]),
("near", ["9.0K", "-9.0K", "9.1K", "-9.1K"]),
("n", ["9.0K", "-9.0K", "9.1K", "-9.1K"]),
("from-zero", ["9.1k", "-9.1k", "9.1k", "-9.1k"]),
("from-zer", ["9.1k", "-9.1k", "9.1k", "-9.1k"]),
("f", ["9.1k", "-9.1k", "9.1k", "-9.1k"]),
("towards-zero", ["9.0k", "-9.0k", "9.0k", "-9.0k"]),
("up", ["9.1k", "-9.0k", "9.1k", "-9.0k"]),
("down", ["9.0k", "-9.1k", "9.0k", "-9.1k"]),
("nearest", ["9.0k", "-9.0k", "9.1k", "-9.1k"]),
("near", ["9.0k", "-9.0k", "9.1k", "-9.1k"]),
("n", ["9.0k", "-9.0k", "9.1k", "-9.1k"]),
] {
new_ucmd!()
.args(&[
@ -651,7 +651,7 @@ fn test_transform_with_suffix_on_input() {
.args(&["--suffix=b", "--to=si"])
.pipe_in("2000b")
.succeeds()
.stdout_only("2.0Kb\n");
.stdout_only("2.0kb\n");
}
#[test]
@ -660,7 +660,7 @@ fn test_transform_without_suffix_on_input() {
.args(&["--suffix=b", "--to=si"])
.pipe_in("2000")
.succeeds()
.stdout_only("2.0Kb\n");
.stdout_only("2.0kb\n");
}
#[test]
@ -669,7 +669,7 @@ fn test_transform_with_suffix_and_delimiter() {
.args(&["--suffix=b", "--to=si", "-d=|"])
.pipe_in("1000b|2000|3000")
.succeeds()
.stdout_only("1.0Kb|2000|3000\n");
.stdout_only("1.0kb|2000|3000\n");
}
#[test]

View file

@ -3,6 +3,6 @@ udev 8.2G 0 8.2G 0% /dev
tmpfs 1.7G 2.1M 1.7G 1% /run
/dev/nvme0n1p2 1.1T 433G 523G 46% /
tmpfs 8.3G 145M 8.1G 2% /dev/shm
tmpfs 5.3M 4.1K 5.3M 1% /run/lock
tmpfs 5.3M 4.1k 5.3M 1% /run/lock
tmpfs 8.3G 0 8.3G 0% /sys/fs/cgroup
/dev/nvme0n1p1 536M 8.2M 528M 2% /boot/efi

View file

@ -1,34 +1,34 @@
-1.1K
-1.0K
-1.1k
-1.0k
-999
1
500
999
1.0K
1.0K
1.1K
1.1K
9.9K
10K
10K
10K
10K
10K
11K
11K
11K
50K
99K
100K
100K
100K
100K
100K
101K
101K
101K
102K
999K
1.0k
1.0k
1.1k
1.1k
9.9k
10k
10k
10k
10k
10k
11k
11k
11k
50k
99k
100k
100k
100k
100k
100k
101k
101k
101k
102k
999k
1.0M
1.0M
1.0M