Multiplication and division with speed and time ( 1km/2s*5s )
This commit is contained in:
parent
025b1b9169
commit
f082939d5a
33
src/units.rs
33
src/units.rs
@ -353,8 +353,23 @@ pub fn multiply(left: Number, right: Number) -> Result<Number, String> {
|
|||||||
// length * area, area * length
|
// length * area, area * length
|
||||||
let result = (left.value * left.unit.weight()) * (right.value * right.unit.weight());
|
let result = (left.value * left.unit.weight()) * (right.value * right.unit.weight());
|
||||||
Ok(to_ideal_unit(Number::new(result, CubicMillimeter)))
|
Ok(to_ideal_unit(Number::new(result, CubicMillimeter)))
|
||||||
|
} else if lcat == Speed && rcat == Time {
|
||||||
|
// 1 km/h * 1h
|
||||||
|
let kph_value = left.value * left.unit.weight();
|
||||||
|
let hours = convert(right, Hour)?;
|
||||||
|
let result = kph_value * hours.value;
|
||||||
|
let final_unit = match left.unit {
|
||||||
|
KilometersPerHour => Kilometer,
|
||||||
|
MetersPerSecond => Meter,
|
||||||
|
MilesPerHour => Mile,
|
||||||
|
FeetPerSecond => Foot,
|
||||||
|
Knot => NauticalMile,
|
||||||
|
_ => Meter,
|
||||||
|
};
|
||||||
|
let kilometers = Number::new(result, Kilometer);
|
||||||
|
Ok(convert(kilometers, final_unit)?)
|
||||||
} else {
|
} else {
|
||||||
return Err(format!("Cannot multiply {:?} and {:?}", left.unit, right.unit))
|
Err(format!("Cannot multiply {:?} and {:?}", left.unit, right.unit))
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -375,11 +390,27 @@ pub fn divide(left: Number, right: Number) -> Result<Number, String> {
|
|||||||
let (left, right) = convert_to_lowest(left, right)?;
|
let (left, right) = convert_to_lowest(left, right)?;
|
||||||
Ok(Number::new(left.value * right.value, NoUnit))
|
Ok(Number::new(left.value * right.value, NoUnit))
|
||||||
} else if (lcat == Area && rcat == Length) || (lcat == Volume && rcat == Area) {
|
} else if (lcat == Area && rcat == Length) || (lcat == Volume && rcat == Area) {
|
||||||
|
// 1 km2 / 1 km, 1 km3 / 1 km2
|
||||||
let result = (left.value * left.unit.weight()) / (right.value * right.unit.weight());
|
let result = (left.value * left.unit.weight()) / (right.value * right.unit.weight());
|
||||||
Ok(to_ideal_unit(Number::new(result, Millimeter)))
|
Ok(to_ideal_unit(Number::new(result, Millimeter)))
|
||||||
} else if lcat == Volume && rcat == Length {
|
} else if lcat == Volume && rcat == Length {
|
||||||
|
// 1 km3 / 1 km
|
||||||
let result = (left.value * left.unit.weight()) / (right.value * right.unit.weight());
|
let result = (left.value * left.unit.weight()) / (right.value * right.unit.weight());
|
||||||
Ok(to_ideal_unit(Number::new(result, SquareMillimeter)))
|
Ok(to_ideal_unit(Number::new(result, SquareMillimeter)))
|
||||||
|
} else if lcat == Length && rcat == Time {
|
||||||
|
// 1 km / 2s
|
||||||
|
let final_unit = match (left.unit, right.unit) {
|
||||||
|
(Kilometer, Hour) => KilometersPerHour,
|
||||||
|
(Meter, Second) => MetersPerSecond,
|
||||||
|
(Mile, Hour) => MilesPerHour,
|
||||||
|
(Foot, Second) => FeetPerSecond,
|
||||||
|
(NauticalMile, Hour) => Knot,
|
||||||
|
_ => KilometersPerHour,
|
||||||
|
};
|
||||||
|
let kilometers = convert(left, Kilometer)?;
|
||||||
|
let hours = convert(right, Hour)?;
|
||||||
|
let kph = Number::new(kilometers.value / hours.value, KilometersPerHour);
|
||||||
|
Ok(convert(kph, final_unit)?)
|
||||||
} else {
|
} else {
|
||||||
Err(format!("Cannot divide {:?} by {:?}", left.unit, right.unit))
|
Err(format!("Cannot divide {:?} by {:?}", left.unit, right.unit))
|
||||||
}
|
}
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user