U_CAPI double U_EXPORT2 unum_parseDoubleCurrency(const UNumberFormat* fmt, const UChar* text, int32_t textLength, int32_t* parsePos, /* 0 = start */ UChar* currency, UErrorCode* status) { double doubleVal = 0.0; currency[0] = 0; if (U_FAILURE(*status)) { return doubleVal; } const UnicodeString src((UBool)(textLength == -1), text, textLength); ParsePosition pp; if (parsePos != NULL) { pp.setIndex(*parsePos); } *status = U_PARSE_ERROR; // assume failure, reset if succeed LocalPointer<CurrencyAmount> currAmt(((const NumberFormat*)fmt)->parseCurrency(src, pp)); if (pp.getErrorIndex() != -1) { if (parsePos != NULL) { *parsePos = pp.getErrorIndex(); } } else { if (parsePos != NULL) { *parsePos = pp.getIndex(); } if (pp.getIndex() > 0) { *status = U_ZERO_ERROR; u_strcpy(currency, currAmt->getISOCurrency()); doubleVal = currAmt->getNumber().getDouble(*status); } } return doubleVal; }
CurrencyAmount* NumberFormat::parseCurrency(const UnicodeString& text, ParsePosition& pos) const { // Default implementation only -- subclasses should override Formattable parseResult; int32_t start = pos.getIndex(); parse(text, parseResult, pos); if (pos.getIndex() != start) { UChar curr[4]; UErrorCode ec = U_ZERO_ERROR; getEffectiveCurrency(curr, ec); if (U_SUCCESS(ec)) { LocalPointer<CurrencyAmount> currAmt(new CurrencyAmount(parseResult, curr, ec)); if (U_FAILURE(ec)) { pos.setIndex(start); // indicate failure } else { return currAmt.orphan(); } } } return NULL; }