Skip to content

Commit

Permalink
formatter[eng]: Reapply prefix after rounding
Browse files Browse the repository at this point in the history
  • Loading branch information
bim9262 committed Jan 4, 2025
1 parent 4dd8ae4 commit d02b7cd
Show file tree
Hide file tree
Showing 3 changed files with 65 additions and 7 deletions.
9 changes: 5 additions & 4 deletions cspell.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -31,6 +31,7 @@ words:
- bugz
- busctl
- caldav
- ccache
- chrono
- clippy
- CLOEXEC
Expand Down Expand Up @@ -167,6 +168,7 @@ words:
- tzset
- udev
- uevent
- unapply
- unshift
- unspec
- upower
Expand All @@ -188,9 +190,8 @@ words:
- xrandr
- xtask
- zbus
- zvariant
- zwlr
- zswap
- zram
- zswap
- Zswapped
- ccache
- zvariant
- zwlr
59 changes: 56 additions & 3 deletions src/formatting/formatter/eng.rs
Original file line number Diff line number Diff line change
Expand Up @@ -139,7 +139,7 @@ impl Formatter for EngFormatter {
(None, _) => (Prefix::min_available(), Prefix::max_available()),
};

let prefix = unit
let mut prefix = unit
.clamp_prefix(if min_prefix.is_binary() {
Prefix::eng_binary(val)
} else {
Expand All @@ -160,8 +160,27 @@ impl Formatter for EngFormatter {

let sign = if is_negative { "-" } else { "" };
let mut retval = match self.width as i32 - digits {
i32::MIN..=0 => format!("{sign}{}", val.round()),
1 => format!("{}{sign}{}", self.pad_with, val.round() as i64),
i32::MIN..=1 => {
// Remove prefix after rounding value to be displayed
val = prefix.unapply(val.round());

prefix = unit
.clamp_prefix(if min_prefix.is_binary() {
Prefix::eng_binary(val)
} else {
Prefix::eng(val)
})
.clamp(min_prefix, max_prefix);
val = prefix.apply(val);

digits = (val.max(1.).log10().floor() + 1.0) as i32 + is_negative as i32;

match self.width as i32 - digits {
i32::MIN..=0 => format!("{sign}{}", val),
1 => format!("{}{sign}{}", self.pad_with, val as i64),
rest => format!("{sign}{val:.*}", rest as usize - 1),
}
}
rest => format!("{sign}{val:.*}", rest as usize - 1),
};

Expand Down Expand Up @@ -278,6 +297,40 @@ mod tests {
)
.unwrap();
assert_eq!(result, "321.6GB");

let fmt = new_fmt!(eng, w: 3, p: K).unwrap();
let result = fmt
.format(
&Value::Number {
val: 998_888.,
unit: Unit::Bytes,
},
&config,
)
.unwrap();
assert_eq!(result, "999KB");

let result = fmt
.format(
&Value::Number {
val: 999_888.,
unit: Unit::Bytes,
},
&config,
)
.unwrap();
assert_eq!(result, "1.0MB");

let result = fmt
.format(
&Value::Number {
val: 1_000_000.,
unit: Unit::Bytes,
},
&config,
)
.unwrap();
assert_eq!(result, "1.0MB");
}

#[test]
Expand Down
4 changes: 4 additions & 0 deletions src/formatting/prefix.rs
Original file line number Diff line number Diff line change
Expand Up @@ -71,6 +71,10 @@ impl Prefix {
value / MUL[self as usize]
}

pub fn unapply(self, value: f64) -> f64 {
value * MUL[self as usize]
}

pub fn eng(mut number: f64) -> Self {
if number == 0.0 {
Self::One
Expand Down

0 comments on commit d02b7cd

Please # to comment.