]> granicus.if.org Git - icu/commitdiff
ICU-8593 RuleBasedNumberFormat::format(double,...) should handle NAN
authorPeter Edberg <pedberg@unicode.org>
Thu, 30 Jun 2011 05:43:56 +0000 (05:43 +0000)
committerPeter Edberg <pedberg@unicode.org>
Thu, 30 Jun 2011 05:43:56 +0000 (05:43 +0000)
X-SVN-Rev: 30258

icu4c/source/i18n/rbnf.cpp
icu4c/source/test/cintltst/cnumtst.c

index 2e20b92bc08ca85325e899c89426f603d3ce12e5..4b88869a230c13634e02755e0b0a24cf81a9803b 100644 (file)
@@ -1067,7 +1067,15 @@ RuleBasedNumberFormat::format(double number,
                               UnicodeString& toAppendTo,
                               FieldPosition& /* pos */) const
 {
-    if (defaultRuleSet) defaultRuleSet->format(number, toAppendTo, toAppendTo.length());
+    // Special case for NaN; adapted from what DecimalFormat::_format( double number,...) does.
+    if (uprv_isNaN(number)) {
+        DecimalFormatSymbols* decFmtSyms = getDecimalFormatSymbols(); // RuleBasedNumberFormat internal
+        if (decFmtSyms) {
+            toAppendTo += decFmtSyms->getConstSymbol(DecimalFormatSymbols::kNaNSymbol);
+        }
+    } else if (defaultRuleSet) {
+        defaultRuleSet->format(number, toAppendTo, toAppendTo.length());
+    }
     return toAppendTo;
 }
 
index cc9963ef4542ca532ca5a48263610fce0651d318..cd371ca90be99e490e0e469164d7aa60047f3cb4 100644 (file)
@@ -1636,6 +1636,23 @@ static void TestRBNFFormat() {
         test_fmt(formats[i], (UBool)(i == 0));
     }
 
+    #define FORMAT_BUF_CAPACITY 64
+    {
+        UChar fmtbuf[FORMAT_BUF_CAPACITY];
+        int32_t len;
+        double nanvalue = uprv_getNaN();
+        status = U_ZERO_ERROR;
+        len = unum_formatDouble(formats[1], nanvalue, fmtbuf, FORMAT_BUF_CAPACITY, NULL, &status);
+        if (U_FAILURE(status)) {
+            log_err_status(status, "unum_formatDouble NAN failed with %s\n", u_errorName(status));
+        } else {
+            UChar nansym[] = { 0x4E, 0x61, 0x4E, 0 }; /* NaN */
+            if ( len != 3 || u_strcmp(fmtbuf, nansym) != 0 ) {
+                log_err("unum_formatDouble NAN produced wrong answer for en_US\n");
+            }
+        }
+    }
+
     for (i = 0; i < COUNT; ++i) {
         unum_close(formats[i]);
     }