Skip to content

Commit 897252f

Browse files
committed
Add unit scaling for display.
1 parent 0d3016b commit 897252f

File tree

6 files changed

+67
-14
lines changed

6 files changed

+67
-14
lines changed

examples/format_test.rs

Lines changed: 10 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -3,13 +3,15 @@ use measurements::Temperature;
33
use measurements::Length;
44
use measurements::Pressure;
55
use measurements::Volume;
6+
use measurements::Weight;
67
fn main() {
7-
let t = Temperature::from_celsius(123.456);
8-
let d = Length::from_meters(123.456);
9-
let p = Pressure::from_millibars(123.456);
10-
let v = Volume::from_litres(123.456);
11-
println!("Temp of {0:.5} outside", t);
12-
println!("Distance of {0:.5}", d);
13-
println!("Pressure of {0:.5}", p);
14-
println!("Volume of {0:.5}", v);
8+
for power in -9..9 {
9+
let val: f64 = 123.456 * (10.0f64.powf(power as f64));
10+
println!("10^{}...", power);
11+
println!("Temp of {0:.3} outside", Temperature::from_kelvin(val));
12+
println!("Distance of {0:.3}", Length::from_meters(val));
13+
println!("Pressure of {0:.3}", Pressure::from_millibars(val));
14+
println!("Volume of {0:.3}", Volume::from_litres(val));
15+
println!("Weight of {0:.3}", Weight::from_kilograms(val));
16+
}
1517
}

src/length.rs

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -155,6 +155,25 @@ impl Measurement for Length {
155155
fn get_base_units_name(&self) -> &'static str {
156156
"m"
157157
}
158+
159+
fn get_appropriate_units(&self) -> (&'static str, f64) {
160+
if self.meters >= 1_000_000_000.0 {
161+
("million km", self.meters / 1000_000_000.0)
162+
} else if self.meters >= 1_000.0 {
163+
("km", self.meters / 1000.0)
164+
} else if self.meters < 0.000_000_1 {
165+
("nm", self.meters * 1_000_000_000.0)
166+
} else if self.meters < 0.000_1 {
167+
("\u{00B5}m", self.meters * 1_000_000.0)
168+
} else if self.meters < 0.1 {
169+
("mm", self.meters * 1000.0)
170+
} else if self.meters < 1.0 {
171+
("cm", self.meters * 100.0)
172+
} else {
173+
("m", self.meters)
174+
}
175+
}
176+
158177
}
159178

160179
implement_measurement! { Length }

src/measurement.rs

Lines changed: 4 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -35,11 +35,8 @@
3535
/// fn main() { }
3636
/// ```
3737
pub trait Measurement {
38-
fn get_appropriate_units_name(&self) -> &'static str {
39-
self.get_base_units_name()
40-
}
41-
fn get_appropriate_units(&self) -> f64 {
42-
self.get_base_units()
38+
fn get_appropriate_units(&self) -> (&'static str, f64) {
39+
(self.get_base_units_name(), self.get_base_units())
4340
}
4441
fn get_base_units_name(&self) -> &'static str;
4542
fn get_base_units(&self) -> f64;
@@ -56,8 +53,9 @@ macro_rules! implement_display {
5653
fn fmt(&self, f: &mut ::std::fmt::Formatter) -> ::std::fmt::Result {
5754
let p = f.precision().unwrap_or(1);
5855
let w = f.width().unwrap_or(0);
56+
let (unit, value) = self.get_appropriate_units();
5957
write!(f, "{value:width$.prec$}\u{00A0}{unit}",
60-
prec=p, width=w, value=self.get_appropriate_units(), unit=self.get_appropriate_units_name())
58+
prec=p, width=w, value=value, unit=unit)
6159
}
6260
}
6361
)*)

src/pressure.rs

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -87,6 +87,14 @@ impl Measurement for Pressure {
8787
fn get_base_units_name(&self) -> &'static str {
8888
"mbar"
8989
}
90+
91+
fn get_appropriate_units(&self) -> (&'static str, f64) {
92+
if self.millibars >= 1_000.0 {
93+
("bar", self.millibars / 1000.0)
94+
} else {
95+
("mbar", self.millibars)
96+
}
97+
}
9098
}
9199

92100
implement_measurement! { Pressure }

src/volume.rs

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -210,6 +210,18 @@ impl Measurement for Volume {
210210
"l"
211211
}
212212

213+
fn get_appropriate_units(&self) -> (&'static str, f64) {
214+
if self.litres >= 1_000.0 {
215+
("m\u{00B3}", self.litres / 1000.0)
216+
} else if self.litres < 0.000_1 {
217+
("\u{00B5}l", self.litres * 1_000_000.0)
218+
} else if self.litres < 1.0 {
219+
("ml", self.litres * 1000.0)
220+
} else {
221+
("l", self.litres)
222+
}
223+
}
224+
213225
}
214226

215227
implement_measurement! { Volume }

src/weight.rs

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -156,6 +156,20 @@ impl Measurement for Weight {
156156
"kg"
157157
}
158158

159+
fn get_appropriate_units(&self) -> (&'static str, f64) {
160+
if self.kilograms >= 1_000.0 {
161+
("tonnes", self.kilograms / 1000.0)
162+
} else if self.kilograms < 0.000_000_1 {
163+
("\u{00B5}g", self.kilograms * 1_000_000_000.0)
164+
} else if self.kilograms < 0.000_1 {
165+
("mg", self.kilograms * 1_000_000.0)
166+
} else if self.kilograms < 1.0 {
167+
("g", self.kilograms * 1000.0)
168+
} else {
169+
("kg", self.kilograms)
170+
}
171+
}
172+
159173
}
160174

161175
implement_measurement! { Weight }

0 commit comments

Comments
 (0)