@@ -139,7 +139,7 @@ impl Formatter for EngFormatter {
139
139
( None , _) => ( Prefix :: min_available ( ) , Prefix :: max_available ( ) ) ,
140
140
} ;
141
141
142
- let prefix = unit
142
+ let mut prefix = unit
143
143
. clamp_prefix ( if min_prefix. is_binary ( ) {
144
144
Prefix :: eng_binary ( val)
145
145
} else {
@@ -160,8 +160,27 @@ impl Formatter for EngFormatter {
160
160
161
161
let sign = if is_negative { "-" } else { "" } ;
162
162
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
+ }
165
184
rest => format ! ( "{sign}{val:.*}" , rest as usize - 1 ) ,
166
185
} ;
167
186
@@ -278,6 +297,40 @@ mod tests {
278
297
)
279
298
. unwrap ( ) ;
280
299
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" ) ;
281
334
}
282
335
283
336
#[ test]
0 commit comments