···33## Next
44- Add currency symbols
55- Add `as` and `into` keywords for unit conversion
66+- Fix some units not being simplified
6778## 4.1.0 - 2026 Jul 29
89- Add currency units
+24
src/units.rs
···107107 primitives
108108}
109109110110+fn reduce_unit(number: Number) -> Number {
111111+ let mut new_unit: Vec<(Unit, isize)> = Vec::new();
112112+ for (unit, exponent) in &number.unit {
113113+ if unit.category() == UnitType::Temperature {
114114+ new_unit.push((unit.clone(), *exponent));
115115+ continue;
116116+ }
117117+ let existing = new_unit
118118+ .iter_mut()
119119+ .find(|(u, _)| u.category() == unit.category());
120120+ if let Some(existing) = existing {
121121+ existing.1 += exponent;
122122+ } else {
123123+ new_unit.push((unit.clone(), *exponent))
124124+ }
125125+ }
126126+ convert(number.clone(), new_unit).unwrap_or(number)
127127+}
128128+110129// Macro for creating units. Not possible to extend/change the default units
111130// with this because the default units are imported into the lexer, parser
112131// and evaluator
···600619601620/// Convert a [`Number`] to a specified [`Unit`].
602621pub fn convert(number: Number, to_unit: Vec<(Unit, isize)>) -> Result<Number, String> {
622622+ if number.unit == to_unit {
623623+ return Ok(number);
624624+ }
603625 if number.primitive_unit() != primitive_unit(&to_unit) {
604626 return Err(format!(
605627 "Cannot convert {} to {}",
···728750/// `Energy`, `Power`, `ElectricCurrent`, `Resistance`, and `Voltage`.
729751/// Other units are passed through.
730752pub fn to_ideal_unit(number: Number) -> Number {
753753+ let number = reduce_unit(number);
731754 let value = number.value * combined_weight(&number.unit);
732755 let primitive = number.primitive_unit();
733756 if primitive == Length.primitive() {
···906929 .unwrap_or(candidates[0]);
907930 return Number::with_basic_unit(value / unit.weight(), unit);
908931 }
932932+909933 number
910934}
911935