diff --git a/apps/calculation/calculation.cpp b/apps/calculation/calculation.cpp index fb02fea6f..b67efc2b8 100644 --- a/apps/calculation/calculation.cpp +++ b/apps/calculation/calculation.cpp @@ -257,8 +257,9 @@ Calculation::AdditionalInformationType Calculation::additionalInformationType(Co if (o.hasUnit()) { Expression unit; PoincareHelpers::ReduceAndRemoveUnit(&o, App::app()->localContext(), ExpressionNode::ReductionTarget::User, &unit, ExpressionNode::SymbolicComputation::ReplaceAllSymbolsWithDefinitionsOrUndefined, ExpressionNode::UnitConversion::None); - double value = PoincareHelpers::ApproximateToScalar(o, App::app()->localContext()); - return (Unit::ShouldDisplayAdditionalOutputs(value, unit, GlobalPreferences::sharedGlobalPreferences()->unitFormat())) ? AdditionalInformationType::Unit : AdditionalInformationType::None; + UnitNode::Vector vector = UnitNode::Vector::FromBaseUnits(unit); + const Unit::Representative * representative = Unit::Representative::RepresentativeForDimension(vector); + return representative != nullptr ? AdditionalInformationType::Unit : AdditionalInformationType::None; } if (o.isBasedIntegerCappedBy(k_maximalIntegerWithAdditionalInformation)) { return AdditionalInformationType::Integer; diff --git a/poincare/include/poincare/unit.h b/poincare/include/poincare/unit.h index 9b16f895e..6693e0c96 100644 --- a/poincare/include/poincare/unit.h +++ b/poincare/include/poincare/unit.h @@ -705,7 +705,7 @@ public: static Unit Builder(const Representative * representative, const Prefix * prefix); static bool CanParse(const char * symbol, size_t length, const Representative * * representative, const Prefix * * prefix); static void ChooseBestRepresentativeAndPrefixForValue(Expression units, double * value, ExpressionNode::ReductionContext reductionContext); - static bool ShouldDisplayAdditionalOutputs(double value, Expression unit, Preferences::UnitFormat unitFormat); + static bool HaveAdditionalOutputs(double value, Expression unit, Preferences::UnitFormat unitFormat); static int SetAdditionalExpressionsAndMessage(Expression units, double value, Expression * dest, int availableLength, ExpressionNode::ReductionContext reductionContext, I18n::Message * message); static Expression BuildSplit(double value, const Unit * units, int length, ExpressionNode::ReductionContext reductionContext); static Expression ConvertTemperatureUnits(Expression e, Unit unit, ExpressionNode::ReductionContext reductionContext); diff --git a/poincare/src/unit.cpp b/poincare/src/unit.cpp index 6d792addd..841adfec9 100644 --- a/poincare/src/unit.cpp +++ b/poincare/src/unit.cpp @@ -11,6 +11,8 @@ #include #include #include +#include + namespace Poincare { @@ -765,7 +767,7 @@ void Unit::ChooseBestRepresentativeAndPrefixForValue(Expression units, double * } } -bool Unit::ShouldDisplayAdditionalOutputs(double value, Expression unit, Preferences::UnitFormat unitFormat) { +bool Unit::HaveAdditionalOutputs(double value, Expression unit, Preferences::UnitFormat unitFormat) { if (unit.isUninitialized()) { return false; } @@ -776,7 +778,8 @@ bool Unit::ShouldDisplayAdditionalOutputs(double value, Expression unit, Prefere return e.type() == ExpressionNode::Type::Unit && !e.convert().isBaseUnit(); }; - return representative != nullptr || unit.hasExpression(isNonBase, nullptr); + return (representative != nullptr && representative->hasSpecialAdditionalExpressions(value, unitFormat)) + || unit.hasExpression(isNonBase, nullptr); } int Unit::SetAdditionalExpressionsAndMessage(Expression units, double value, Expression * dest, int availableLength, ExpressionNode::ReductionContext reductionContext, I18n::Message * message) { @@ -788,7 +791,10 @@ int Unit::SetAdditionalExpressionsAndMessage(Expression units, double value, Exp return 0; } *message = representative->dimensionMessage(); - return representative->setAdditionalExpressions(value, dest, availableLength, reductionContext); + if (Unit::HaveAdditionalOutputs(value, units, reductionContext.unitFormat())) { + return representative->setAdditionalExpressions(value, dest, availableLength, reductionContext); + } + return 0; } Expression Unit::BuildSplit(double value, const Unit * units, int length, ExpressionNode::ReductionContext reductionContext) { diff --git a/poincare/test/expression_properties.cpp b/poincare/test/expression_properties.cpp index c3b0e21b0..36e015074 100644 --- a/poincare/test/expression_properties.cpp +++ b/poincare/test/expression_properties.cpp @@ -452,7 +452,7 @@ void assert_additional_results_compute_to(const char * expression, const char * Expression e = parse_expression(expression, &globalContext, false).reduceAndRemoveUnit(reductionContext, &units); double value = e.approximateToScalar(&globalContext, Cartesian, Degree); - if (!Unit::ShouldDisplayAdditionalOutputs(value, units, unitFormat)) { + if (!Unit::HaveAdditionalOutputs(value, units, unitFormat)) { quiz_assert(length == 0); return; }