Skip to content

Commit d02b7cd

Browse files
committed
formatter[eng]: Reapply prefix after rounding
Fixes: greshake#2081
1 parent 4dd8ae4 commit d02b7cd

File tree

3 files changed

+65
-7
lines changed

3 files changed

+65
-7
lines changed

cspell.yaml

+5-4
Original file line numberDiff line numberDiff line change
@@ -31,6 +31,7 @@ words:
3131
- bugz
3232
- busctl
3333
- caldav
34+
- ccache
3435
- chrono
3536
- clippy
3637
- CLOEXEC
@@ -167,6 +168,7 @@ words:
167168
- tzset
168169
- udev
169170
- uevent
171+
- unapply
170172
- unshift
171173
- unspec
172174
- upower
@@ -188,9 +190,8 @@ words:
188190
- xrandr
189191
- xtask
190192
- zbus
191-
- zvariant
192-
- zwlr
193-
- zswap
194193
- zram
194+
- zswap
195195
- Zswapped
196-
- ccache
196+
- zvariant
197+
- zwlr

src/formatting/formatter/eng.rs

+56-3
Original file line numberDiff line numberDiff line change
@@ -139,7 +139,7 @@ impl Formatter for EngFormatter {
139139
(None, _) => (Prefix::min_available(), Prefix::max_available()),
140140
};
141141

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

161161
let sign = if is_negative { "-" } else { "" };
162162
let mut retval = match self.width as i32 - digits {
163-
i32::MIN..=0 => format!("{sign}{}", val.round()),
164-
1 => format!("{}{sign}{}", self.pad_with, val.round() as i64),
163+
i32::MIN..=1 => {
164+
// Remove prefix after rounding value to be displayed
165+
val = prefix.unapply(val.round());
166+
167+
prefix = unit
168+
.clamp_prefix(if min_prefix.is_binary() {
169+
Prefix::eng_binary(val)
170+
} else {
171+
Prefix::eng(val)
172+
})
173+
.clamp(min_prefix, max_prefix);
174+
val = prefix.apply(val);
175+
176+
digits = (val.max(1.).log10().floor() + 1.0) as i32 + is_negative as i32;
177+
178+
match self.width as i32 - digits {
179+
i32::MIN..=0 => format!("{sign}{}", val),
180+
1 => format!("{}{sign}{}", self.pad_with, val as i64),
181+
rest => format!("{sign}{val:.*}", rest as usize - 1),
182+
}
183+
}
165184
rest => format!("{sign}{val:.*}", rest as usize - 1),
166185
};
167186

@@ -278,6 +297,40 @@ mod tests {
278297
)
279298
.unwrap();
280299
assert_eq!(result, "321.6GB");
300+
301+
let fmt = new_fmt!(eng, w: 3, p: K).unwrap();
302+
let result = fmt
303+
.format(
304+
&Value::Number {
305+
val: 998_888.,
306+
unit: Unit::Bytes,
307+
},
308+
&config,
309+
)
310+
.unwrap();
311+
assert_eq!(result, "999KB");
312+
313+
let result = fmt
314+
.format(
315+
&Value::Number {
316+
val: 999_888.,
317+
unit: Unit::Bytes,
318+
},
319+
&config,
320+
)
321+
.unwrap();
322+
assert_eq!(result, "1.0MB");
323+
324+
let result = fmt
325+
.format(
326+
&Value::Number {
327+
val: 1_000_000.,
328+
unit: Unit::Bytes,
329+
},
330+
&config,
331+
)
332+
.unwrap();
333+
assert_eq!(result, "1.0MB");
281334
}
282335

283336
#[test]

src/formatting/prefix.rs

+4
Original file line numberDiff line numberDiff line change
@@ -71,6 +71,10 @@ impl Prefix {
7171
value / MUL[self as usize]
7272
}
7373

74+
pub fn unapply(self, value: f64) -> f64 {
75+
value * MUL[self as usize]
76+
}
77+
7478
pub fn eng(mut number: f64) -> Self {
7579
if number == 0.0 {
7680
Self::One

0 commit comments

Comments
 (0)