diff --git a/poincare/src/multiplication.cpp b/poincare/src/multiplication.cpp index aadd50c0c..3a6f8e9e1 100644 --- a/poincare/src/multiplication.cpp +++ b/poincare/src/multiplication.cpp @@ -534,7 +534,21 @@ Expression Multiplication::shallowBeautify(ExpressionNode::ReductionContext redu } else { if (unitConversionMode == ExpressionNode::UnitConversion::Default) { // Find the right unit prefix - Unit::ChooseBestRepresentativeAndPrefixForValue(units, &value, reductionContext); + /* In most cases, unit composition works the same for imperial and + * metric units. However, in imperial, we want volumes to be displayed + * using volume units instead of cubic length. */ + const bool forceVolumeRepresentative = reductionContext.unitFormat() == Preferences::UnitFormat::Imperial && UnitNode::Vector::FromBaseUnits(units) == UnitNode::VolumeRepresentative::Default().dimensionVector(); + const UnitNode::Representative * repr; + if (forceVolumeRepresentative) { + /* The choice of representative doesn't matter, as it will be tuned to a + * system appropriate one in Step 2b. */ + repr = UnitNode::VolumeRepresentative::Default().representativesOfSameDimension(); + units = Unit::Builder(repr, UnitNode::Prefix::EmptyPrefix()); + value /= repr->ratio(); + Unit::ChooseBestRepresentativeAndPrefixForValue(units, &value, reductionContext); + } else { + Unit::ChooseBestRepresentativeAndPrefixForValue(units, &value, reductionContext); + } } // Build final Expression result = Multiplication::Builder(Number::FloatNumber(value), units); diff --git a/poincare/test/simplification.cpp b/poincare/test/simplification.cpp index f4cf7a7d0..8fe5e021b 100644 --- a/poincare/test/simplification.cpp +++ b/poincare/test/simplification.cpp @@ -341,6 +341,8 @@ QUIZ_CASE(poincare_simplification_units) { assert_parsed_expression_simplify_to("_in", "1×_in", User, Radian, Imperial); assert_parsed_expression_simplify_to("_ft", "1×_ft", User, Radian, Imperial); assert_parsed_expression_simplify_to("_yd", "1×_yd", User, Radian, Imperial); + assert_parsed_expression_simplify_to("1_qt", "1×_qt", User, Radian, Imperial); + assert_parsed_expression_simplify_to("1_qt", "946.352946×_cm^3"); /* Unit sum/subtract */ assert_parsed_expression_simplify_to("_m+_m", "2×_m");