ICU-8593 RuleBasedNumberFormat::format(double,...) should handle NAN

X-SVN-Rev: 30258
This commit is contained in:
Peter Edberg 2011-06-30 05:43:56 +00:00
parent ec987e4fe9
commit 1d01381d47
2 changed files with 26 additions and 1 deletions

View 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;
}

View 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]);
}