]> granicus.if.org Git - icu/commitdiff
address Shane's comments2
authorYounies Mahmoud <younies.mahmoud@gmail.com>
Tue, 17 Mar 2020 22:55:39 +0000 (23:55 +0100)
committerYounies Mahmoud <younies.mahmoud@gmail.com>
Tue, 17 Mar 2020 22:55:39 +0000 (23:55 +0100)
icu4c/source/i18n/unitconverter.cpp
icu4c/source/test/intltest/unitstest.cpp

index 169c48b36bc589bd1d8997abfa96eec0c70e6fb7..66b732e473922bd46f2d33ec5de3612f81b6d7ca 100644 (file)
@@ -68,8 +68,7 @@ double strToDouble(StringPiece strNum) {
     // StringToDoubleConverter.
     StringToDoubleConverter converter(0, 0, 0, "", "");
     int32_t count;
-    return converter.StringToDouble(reinterpret_cast<const uint16_t *>(strNum.length()), strNum.length(),
-                                    &count);
+    return converter.StringToDouble(strNum.data(), strNum.length(), &count);
 }
 
 // Returns `double` from a scientific number that could has a division sign (i.e. "1", "2.01", "3.09E+4"
@@ -448,16 +447,20 @@ MeasureUnit extractTarget(MeasureUnit source, UErrorCode &status) {
         if (U_FAILURE(status)) return result;
 
         MeasureUnit targetUnit = MeasureUnit::forIdentifier(target, status);
-        auto tempTargetUnit = TempSingleUnit::forMeasureUnit(targetUnit, status);
-        tempTargetUnit.siPrefix = singleUnit.getSIPrefix(status);
-        tempTargetUnit.dimensionality = singleUnit.getDimensionality(status);
+        auto targetSingleUnits = targetUnit.splitToSingleUnits(status);
         if (U_FAILURE(status)) return result;
 
-        auto targetUnits = tempTargetUnit.build(status);
-        if (U_FAILURE(status)) return result;
+        for (int i = 0, n = targetSingleUnits.length(); i < n; ++i) {
+            auto tempTargetUnit = TempSingleUnit::forMeasureUnit(targetSingleUnits[i], status);
+            tempTargetUnit.dimensionality = singleUnit.getDimensionality(status);
+            if (U_FAILURE(status)) return result;
 
-        result = result.product(targetUnits, status);
-        if (U_FAILURE(status)) return result;
+            auto targetUnits = tempTargetUnit.build(status);
+            if (U_FAILURE(status)) return result;
+
+            result = result.product(targetUnits, status);
+            if (U_FAILURE(status)) return result;
+        }
     }
 
     return result;
index e447e5cce8f577ac1fed7c762350eb6eb9d3c2c6..def8966f903f50fceeab98fb9d02acf96ade7b25 100644 (file)
@@ -37,6 +37,7 @@ class UnitsTest : public IntlTest {
     void testComplicatedUnits();
     void testCLDRUnitsTests();
     void testCLDRUnitsTests2();
+    void testStatus();
 
     // TODO(younies): remove after using CLDR test cases.
     void verifyTestCase(const UnitConversionTestCase &testCase);
@@ -56,6 +57,7 @@ void UnitsTest::runIndexedTest(int32_t index, UBool exec, const char *&name, cha
     TESTCASE_AUTO(testComplicatedUnits);
     TESTCASE_AUTO(testCLDRUnitsTests);
     TESTCASE_AUTO(testCLDRUnitsTests2);
+    TESTCASE_AUTO(testStatus);
     TESTCASE_AUTO_END;
 }
 
@@ -510,4 +512,11 @@ void UnitsTest::testConversions() {
     }
 }
 
+/**
+ * Tests different return statuses depending on the input.
+ */
+void UnitsTest::testStatus() {
+
+}
+
 #endif /* #if !UCONFIG_NO_FORMATTING */