Skip to content

Commit b0ad528

Browse files
authored
Merge pull request #26 from KSXGitHub/decimal
Show decimals
2 parents e6b5e2d + df717f3 commit b0ad528

File tree

4 files changed

+299
-316
lines changed

4 files changed

+299
-316
lines changed

src/bytes_format/formatter.rs

Lines changed: 6 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -24,13 +24,14 @@ impl Formatter {
2424
}
2525

2626
/// Parse a value according to the prefixing rule.
27-
pub const fn parse_value(self, value: u64) -> ParsedValue {
27+
pub fn parse_value(self, value: u64) -> ParsedValue {
28+
let float_value = value as f32;
2829
macro_rules! check {
2930
($exp:literal => $unit:literal) => {{
3031
let scale = self.scale($exp);
3132
if value >= scale {
32-
return ParsedValue {
33-
coefficient: rounded_div::u64(value, scale),
33+
return ParsedValue::Big {
34+
coefficient: float_value / (scale as f32),
3435
unit: $unit,
3536
exponent: $exp,
3637
scale,
@@ -44,11 +45,8 @@ impl Formatter {
4445
check!(3 => 'G');
4546
check!(2 => 'M');
4647
check!(1 => 'K');
47-
ParsedValue {
48-
coefficient: value,
49-
unit: 'B',
50-
scale: 1,
51-
exponent: 0,
48+
ParsedValue::Small {
49+
value: value as u16,
5250
}
5351
}
5452
}

src/bytes_format/parsed_value.rs

Lines changed: 15 additions & 30 deletions
Original file line numberDiff line numberDiff line change
@@ -2,38 +2,23 @@ use derive_more::Display;
22

33
/// Return value of [`Formatter::parse_value`](super::Formatter::parse_value).
44
#[derive(Debug, Display, Clone, Copy)]
5-
#[display(fmt = "{}{}", coefficient, unit)]
6-
pub struct ParsedValue {
7-
pub(super) coefficient: u64,
8-
pub(super) unit: char,
9-
pub(super) scale: u64,
10-
pub(super) exponent: usize,
11-
}
12-
13-
macro_rules! parsed_value_getter {
14-
($(#[$attributes:meta])* $field:ident: $result:ty) => {
15-
$(#[$attributes])*
16-
pub const fn $field(self) -> $result {
17-
self.$field
18-
}
19-
};
20-
}
21-
22-
impl ParsedValue {
23-
parsed_value_getter!(
5+
pub enum ParsedValue {
6+
/// When input value is less than `scale_base`.
7+
#[display(fmt = "{} ", value)]
8+
Small {
9+
/// Input value that is less than `scale_base`.
10+
value: u16,
11+
},
12+
/// When input value is greater than `scale_base`.
13+
#[display(fmt = "{:.1}{}", coefficient, unit)]
14+
Big {
2415
/// The visible part of the number.
25-
coefficient: u64
26-
);
27-
parsed_value_getter!(
16+
coefficient: f32,
2817
/// The unit that follows `coefficient`.
29-
unit: char
30-
);
31-
parsed_value_getter!(
18+
unit: char,
3219
/// The divisor that was used upon the original number to get `coefficient`.
33-
scale: u64
34-
);
35-
parsed_value_getter!(
20+
scale: u64,
3621
/// The exponent that was used upon base scale to get `scale`.
37-
exponent: usize
38-
);
22+
exponent: usize,
23+
},
3924
}

tests/bytes_format.rs

Lines changed: 28 additions & 28 deletions
Original file line numberDiff line numberDiff line change
@@ -12,32 +12,32 @@ macro_rules! test_case {
1212

1313
test_case!(plain_number -> 65_535 in PlainNumber == "65535");
1414

15-
test_case!(metric_of_0 -> 0 in MetricUnits == "0B");
16-
test_case!(metric_of_750 -> 750 in MetricUnits == "750B");
17-
test_case!(metric_of_1000 -> 1_000 in MetricUnits == "1K");
18-
test_case!(metric_of_1024 -> 1_024 in MetricUnits == "1K");
19-
test_case!(metric_of_1500 -> 1_500 in MetricUnits == "2K");
20-
test_case!(metric_of_1750 -> 1_750 in MetricUnits == "2K");
21-
test_case!(metric_of_2000 -> 2_000 in MetricUnits == "2K");
22-
test_case!(metric_of_1mil -> 1_000_000 in MetricUnits == "1M");
23-
test_case!(metric_of_2mil -> 2_000_000 in MetricUnits == "2M");
24-
test_case!(metric_of_2mil9 -> 2_900_000 in MetricUnits == "3M");
25-
test_case!(metric_of_1bil -> 1_000_000_000 in MetricUnits == "1G");
26-
test_case!(metric_of_1trill -> 1_000_000_000_000 in MetricUnits == "1T");
27-
test_case!(metric_of_1quard -> 1_000_000_000_000_000 in MetricUnits == "1P");
28-
test_case!(metric_of_1quint -> 1_000_000_000_000_000_000 in MetricUnits == "1000P");
15+
test_case!(metric_of_0 -> 0 in MetricUnits == "0 ");
16+
test_case!(metric_of_750 -> 750 in MetricUnits == "750 ");
17+
test_case!(metric_of_1000 -> 1_000 in MetricUnits == "1.0K");
18+
test_case!(metric_of_1024 -> 1_024 in MetricUnits == "1.0K");
19+
test_case!(metric_of_1500 -> 1_500 in MetricUnits == "1.5K");
20+
test_case!(metric_of_1750 -> 1_750 in MetricUnits == "1.8K");
21+
test_case!(metric_of_2000 -> 2_000 in MetricUnits == "2.0K");
22+
test_case!(metric_of_1mil -> 1_000_000 in MetricUnits == "1.0M");
23+
test_case!(metric_of_2mil -> 2_000_000 in MetricUnits == "2.0M");
24+
test_case!(metric_of_2mil9 -> 2_900_000 in MetricUnits == "2.9M");
25+
test_case!(metric_of_1bil -> 1_000_000_000 in MetricUnits == "1.0G");
26+
test_case!(metric_of_1trill -> 1_000_000_000_000 in MetricUnits == "1.0T");
27+
test_case!(metric_of_1quard -> 1_000_000_000_000_000 in MetricUnits == "1.0P");
28+
test_case!(metric_of_1quint -> 1_000_000_000_000_000_000 in MetricUnits == "1000.0P");
2929

30-
test_case!(binary_of_0 -> 0 in BinaryUnits == "0B");
31-
test_case!(binary_of_750 -> 750 in BinaryUnits == "750B");
32-
test_case!(binary_of_1000 -> 1_000 in BinaryUnits == "1000B");
33-
test_case!(binary_of_1024 -> 1_024 in BinaryUnits == "1K");
34-
test_case!(binary_of_1500 -> 1_500 in BinaryUnits == "1K");
35-
test_case!(binary_of_1750 -> 1_750 in BinaryUnits == "2K");
36-
test_case!(binary_of_2000 -> 2_000 in BinaryUnits == "2K");
37-
test_case!(binary_of_1mil -> 1_000_000 in BinaryUnits == "977K");
38-
test_case!(binary_of_2mil -> 2_000_000 in BinaryUnits == "2M");
39-
test_case!(binary_of_2mil9 -> 2_900_000 in BinaryUnits == "3M");
40-
test_case!(binary_of_1bil -> 1_000_000_000 in BinaryUnits == "954M");
41-
test_case!(binary_of_1trill -> 1_000_000_000_000 in BinaryUnits == "931G");
42-
test_case!(binary_of_1quard -> 1_000_000_000_000_000 in BinaryUnits == "909T");
43-
test_case!(binary_of_1quint -> 1_000_000_000_000_000_000 in BinaryUnits == "888P");
30+
test_case!(binary_of_0 -> 0 in BinaryUnits == "0 ");
31+
test_case!(binary_of_750 -> 750 in BinaryUnits == "750 ");
32+
test_case!(binary_of_1000 -> 1_000 in BinaryUnits == "1000 ");
33+
test_case!(binary_of_1024 -> 1_024 in BinaryUnits == "1.0K");
34+
test_case!(binary_of_1500 -> 1_500 in BinaryUnits == "1.5K");
35+
test_case!(binary_of_1750 -> 1_750 in BinaryUnits == "1.7K");
36+
test_case!(binary_of_2000 -> 2_000 in BinaryUnits == "2.0K");
37+
test_case!(binary_of_1mil -> 1_000_000 in BinaryUnits == "976.6K");
38+
test_case!(binary_of_2mil -> 2_000_000 in BinaryUnits == "1.9M");
39+
test_case!(binary_of_2mil9 -> 2_900_000 in BinaryUnits == "2.8M");
40+
test_case!(binary_of_1bil -> 1_000_000_000 in BinaryUnits == "953.7M");
41+
test_case!(binary_of_1trill -> 1_000_000_000_000 in BinaryUnits == "931.3G");
42+
test_case!(binary_of_1quard -> 1_000_000_000_000_000 in BinaryUnits == "909.5T");
43+
test_case!(binary_of_1quint -> 1_000_000_000_000_000_000 in BinaryUnits == "888.2P");

0 commit comments

Comments
 (0)