]> granicus.if.org Git - icu/commitdiff
ICU-10419 Fix rounding in NumberFormat.
authorTravis Keep <keep94@gmail.com>
Thu, 10 Oct 2013 21:49:53 +0000 (21:49 +0000)
committerTravis Keep <keep94@gmail.com>
Thu, 10 Oct 2013 21:49:53 +0000 (21:49 +0000)
X-SVN-Rev: 34549

icu4c/source/test/intltest/numfmtst.cpp
icu4c/source/test/intltest/numfmtst.h

index 2a0406a13af55a61f2174a3f47c706fd96411830..6ae2737008471dfc02b76974ee3ebedff3f97c2a 100644 (file)
@@ -130,6 +130,7 @@ void NumberFormatTest::runIndexedTest( int32_t index, UBool exec, const char* &n
   TESTCASE_AUTO(TestParseNegativeWithAlternateMinusSign);
   TESTCASE_AUTO(TestCustomCurrencySignAndSeparator);
   TESTCASE_AUTO(TestParseSignsAndMarks);
+  TESTCASE_AUTO(Test10419RoundingWith0FractionDigits);
   TESTCASE_AUTO_END;
 }
 
@@ -7284,4 +7285,38 @@ void NumberFormatTest::TestParseSignsAndMarks() {
     }
 }
 
+typedef struct {
+  DecimalFormat::ERoundingMode mode;
+  double value;
+  UnicodeString expected;
+} Test10419Data;
+
+
+// Tests that rounding works right when fractional digits is set to 0.
+void NumberFormatTest::Test10419RoundingWith0FractionDigits() {
+    const Test10419Data items[] = {
+        { DecimalFormat::kRoundCeiling, 1.488,  "2"},
+        { DecimalFormat::kRoundDown, 1.588,  "1"},
+        { DecimalFormat::kRoundFloor, 1.888,  "1"},
+        { DecimalFormat::kRoundHalfDown, 1.5,  "1"},
+        { DecimalFormat::kRoundHalfEven, 2.5,  "2"},
+        { DecimalFormat::kRoundHalfUp, 2.5,  "3"},
+        { DecimalFormat::kRoundUp, 1.5,  "2"},
+    };
+    UErrorCode status = U_ZERO_ERROR;
+    LocalPointer<DecimalFormat> decfmt((DecimalFormat *) NumberFormat::createInstance(Locale("en_US"), status));
+    if (U_FAILURE(status)) {
+        dataerrln("Failure creating DecimalFormat %s", u_errorName(status));
+        return;
+    }
+    for (int32_t i = 0; i < sizeof(items) / sizeof(items[0]); ++i) {
+        decfmt->setRoundingMode(items[i].mode);
+        decfmt->setMaximumFractionDigits(0);
+        UnicodeString actual;
+        if (items[i].expected != decfmt->format(items[i].value, actual)) {
+            errln("Expected " + items[i].expected + ", got " + actual);
+        }
+    }
+}
+
 #endif /* #if !UCONFIG_NO_FORMATTING */
index fad385974dca6e2b922b741ab3abe44ecebe7bfb..9e3eada2e4b1814d26a519da25c008ba721b006f 100644 (file)
@@ -175,6 +175,7 @@ class NumberFormatTest: public CalendarTimeZoneTest {
     void TestCustomCurrencySignAndSeparator();
 
     void TestParseSignsAndMarks();
+    void Test10419RoundingWith0FractionDigits();
 
  private:
     UBool testFormattableAsUFormattable(const char *file, int line, Formattable &f);