From d01bcbaa32aa4c1ce17a30782c44c2d619154331 Mon Sep 17 00:00:00 2001 From: Younies Mahmoud Date: Sun, 2 Feb 2020 19:18:27 +0100 Subject: [PATCH] implement convert function --- icu4c/source/i18n/unitconverter.cpp | 20 ++++++++++++++++++++ icu4c/source/i18n/unitconverter.h | 13 ++++++++++--- 2 files changed, 30 insertions(+), 3 deletions(-) diff --git a/icu4c/source/i18n/unitconverter.cpp b/icu4c/source/i18n/unitconverter.cpp index 10d373c6c26..1c014c28fab 100644 --- a/icu4c/source/i18n/unitconverter.cpp +++ b/icu4c/source/i18n/unitconverter.cpp @@ -18,6 +18,26 @@ U_NAMESPACE_BEGIN namespace { +using number::impl::DecNum; + +decNumber UnitConverter::convert(double quantity, UErrorCode status) { + DecNum result; + result.setTo(quantity, status); + + result.multiplyBy(this->conversion_rate_.factorNum, status); + result.divideBy(this->conversion_rate_.factorDen, status); + + if (conversion_rate_.reciprocal) { + DecNum reciprocalResult; + reciprocalResult.setTo(1, status); + reciprocalResult.divideBy(result, status); + + return *(reciprocalResult.getRawDecNumber()); + } + + return *(result.getRawDecNumber()); +} + ////////////////////////// /// BEGIN DATA LOADING /// ////////////////////////// diff --git a/icu4c/source/i18n/unitconverter.h b/icu4c/source/i18n/unitconverter.h index 7b0a3153280..b27cb553140 100644 --- a/icu4c/source/i18n/unitconverter.h +++ b/icu4c/source/i18n/unitconverter.h @@ -33,10 +33,14 @@ struct Factor { int8_t constants[CONSTANTS_COUNT] = {}; }; +/** + * Represents the conversion rate between `source` and `destincation`. + */ struct ConversionRate { StringPiece source; StringPiece target; - Factor factor; + number::impl::DecNum factorNum; + number::impl::DecNum factorDen; bool reciprocal; }; @@ -45,7 +49,7 @@ struct ConversionRate { */ class UnitConverter { public: - /* + /** * Constructor for `UnitConverter`. * NOTE: * - source and target must be under the same category @@ -53,7 +57,10 @@ class UnitConverter { */ UnitConverter(MeasureUnit source, MeasureUnit target, UErrorCode status); - icu::Measure convert(icu::Measure quantity, UErrorCode status); + /** + * Convert quantity in the source unit to the corresponding quantity in the target unit. + */ + decNumber convert(double quantity, UErrorCode status); private: ConversionRate conversion_rate_; -- 2.40.0