]> granicus.if.org Git - icu/commitdiff
implement convert function
authorYounies Mahmoud <youniesmahmoud@youniess-imac.home>
Sun, 2 Feb 2020 18:18:27 +0000 (19:18 +0100)
committerYounies Mahmoud <youniesmahmoud@youniess-imac.home>
Sun, 2 Feb 2020 18:18:27 +0000 (19:18 +0100)
icu4c/source/i18n/unitconverter.cpp
icu4c/source/i18n/unitconverter.h

index 10d373c6c26101f1dbe54bfe91974f9b6c2e57c8..1c014c28fabdeb0a1a4a13331e01d7473ccfdaff 100644 (file)
@@ -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 ///
 //////////////////////////
index 7b0a3153280bd17ab2bd762b7aa36c60b1aef9fa..b27cb553140434f3710ae0604198238d5bfd3ad8 100644 (file)
@@ -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_;