Skip to content

Commit c8ee7d5

Browse files
author
Jonathan Pallant
committed
Re-work formatting to take a list of possible units.
1 parent 34cbc9d commit c8ee7d5

File tree

5 files changed

+61
-40
lines changed

5 files changed

+61
-40
lines changed

src/length.rs

Lines changed: 13 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -246,21 +246,19 @@ impl Measurement for Length {
246246
}
247247

248248
fn get_appropriate_units(&self) -> (&'static str, f64) {
249-
if self.meters >= 1_000_000_000.0 {
250-
("million km", self.meters / 1000_000_000.0)
251-
} else if self.meters >= 1_000.0 {
252-
("km", self.meters / 1000.0)
253-
} else if self.meters < 0.000_000_1 {
254-
("nm", self.meters * 1_000_000_000.0)
255-
} else if self.meters < 0.000_1 {
256-
("\u{00B5}m", self.meters * 1_000_000.0)
257-
} else if self.meters < 0.1 {
258-
("mm", self.meters * 1000.0)
259-
} else if self.meters < 1.0 {
260-
("cm", self.meters * 100.0)
261-
} else {
262-
("m", self.meters)
263-
}
249+
// Smallest to largest
250+
let list = [
251+
("pm", 1e-12),
252+
("nm", 1e-9),
253+
("\u{00B5}m", 1e-6),
254+
("mm", 1e-3),
255+
("cm", 1e-2),
256+
("m", 1e0),
257+
("km", 1e3),
258+
("thousand km", 1e6),
259+
("million km", 1e9),
260+
];
261+
self.pick_appropriate_units(&list)
264262
}
265263
}
266264

src/measurement.rs

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -38,8 +38,26 @@ pub trait Measurement {
3838
fn get_appropriate_units(&self) -> (&'static str, f64) {
3939
(self.get_base_units_name(), self.get_base_units())
4040
}
41+
42+
/// Given a list of units and their scale relative to the base unit,
43+
/// select the most appropriate one.
44+
///
45+
/// The list must be smallest to largest, e.g. ("nanometre", 10-9) to
46+
/// ("kilometre", 10e3)
47+
fn pick_appropriate_units(&self, list: &[(&'static str, f64)]) -> (&'static str, f64) {
48+
for &(ref unit, ref scale) in list.iter().rev() {
49+
let value = self.get_base_units() / scale;
50+
if value.abs() > 1.0 {
51+
return (unit, value);
52+
}
53+
};
54+
(list[0].0, self.get_base_units() / list[0].1)
55+
}
56+
4157
fn get_base_units_name(&self) -> &'static str;
58+
4259
fn get_base_units(&self) -> f64;
60+
4361
fn from_base_units(units: f64) -> Self;
4462
}
4563

src/pressure.rs

Lines changed: 7 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -89,11 +89,13 @@ impl Measurement for Pressure {
8989
}
9090

9191
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-
}
92+
let list = [
93+
("millibars", 1e0),
94+
("bar", 1e3),
95+
("thousand bar", 1e6),
96+
("million bar", 1e9),
97+
];
98+
self.pick_appropriate_units(&list)
9799
}
98100
}
99101

src/volume.rs

Lines changed: 11 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -243,15 +243,17 @@ impl Measurement for Volume {
243243
}
244244

245245
fn get_appropriate_units(&self) -> (&'static str, f64) {
246-
if self.liters >= 1_000.0 {
247-
("m\u{00B3}", self.liters / 1000.0)
248-
} else if self.liters < 0.000_1 {
249-
("\u{00B5}l", self.liters * 1_000_000.0)
250-
} else if self.liters < 1.0 {
251-
("ml", self.liters * 1000.0)
252-
} else {
253-
("l", self.liters)
254-
}
246+
// Smallest to largest
247+
let list = [
248+
("pl", 1e-12),
249+
("nl", 1e-9),
250+
("\u{00B5}l", 1e-6),
251+
("ml", 1e-3),
252+
("l", 1e0),
253+
("m\u{00B3}", 1e3),
254+
("km\u{00B3}", 1e12),
255+
];
256+
self.pick_appropriate_units(&list)
255257
}
256258
}
257259

src/weight.rs

Lines changed: 12 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -159,17 +159,18 @@ impl Measurement for Weight {
159159
}
160160

161161
fn get_appropriate_units(&self) -> (&'static str, f64) {
162-
if self.kilograms >= 1_000.0 {
163-
("tonnes", self.kilograms / 1000.0)
164-
} else if self.kilograms < 0.000_000_1 {
165-
("\u{00B5}g", self.kilograms * 1_000_000_000.0)
166-
} else if self.kilograms < 0.000_1 {
167-
("mg", self.kilograms * 1_000_000.0)
168-
} else if self.kilograms < 1.0 {
169-
("g", self.kilograms * 1000.0)
170-
} else {
171-
("kg", self.kilograms)
172-
}
162+
// Smallest to largest
163+
let list = [
164+
("ng", 1e-12),
165+
("\u{00B5}g", 1e-9),
166+
("mg", 1e-6),
167+
("g", 1e-3),
168+
("kg", 1e0),
169+
("tonnes", 1e3),
170+
("thousand tonnes", 1e6),
171+
("million tonnes", 1e9),
172+
];
173+
self.pick_appropriate_units(&list)
173174
}
174175
}
175176

0 commit comments

Comments
 (0)