std::string GlobalizationNDK::getNumberPattern(const std::string& args) { // This is the default value when no options provided. ENumberType type = kNumberDecimal; if (!args.empty()) { Json::Reader reader; Json::Value root; bool parse = reader.parse(args, root); if (!parse) { slog2f(0, ID_G11N, SLOG2_ERROR, "GlobalizationNDK::getNumberPattern: invalid json data: %s", args.c_str()); return errorInJson(PARSING_ERROR, "Invalid json data!"); } Json::Value options = root["options"]; std::string error; if (!handleNumberOptions(options, type, error)) return errorInJson(PARSING_ERROR, error); } std::string pattern, symbol, positive, negative, decimal, grouping; int fraction; double rounding; UErrorCode status = U_ZERO_ERROR; NumberFormat* nf; switch (type) { case kNumberDecimal: default: nf = NumberFormat::createInstance(status); break; case kNumberCurrency: nf = NumberFormat::createCurrencyInstance(status); break; case kNumberPercent: nf = NumberFormat::createPercentInstance(status); break; } if (!nf) { slog2f(0, ID_G11N, SLOG2_ERROR, "GlobalizationNDK::getNumberPattern: failed to create NumberFormat instance for type %d: %d", status, type); return errorInJson(UNKNOWN_ERROR, "Failed to create NumberFormat instance!"); } std::auto_ptr<NumberFormat> deleter(nf); if (nf->getDynamicClassID() != DecimalFormat::getStaticClassID()) { slog2f(0, ID_G11N, SLOG2_ERROR, "GlobalizationNDK::getNumberPattern: DecimalFormat expected: %p != %p", nf->getDynamicClassID(), DecimalFormat::getStaticClassID()); return errorInJson(UNKNOWN_ERROR, "DecimalFormat expected!"); } DecimalFormat* df = (DecimalFormat*) nf; const DecimalFormatSymbols* dfs = df->getDecimalFormatSymbols(); if (!dfs) { slog2f(0, ID_G11N, SLOG2_ERROR, "GlobalizationNDK::getNumberPattern: unable to get DecimalFormatSymbols!"); return errorInJson(UNKNOWN_ERROR, "Failed to get DecimalFormatSymbols instance!"); } UnicodeString ucs; df->toPattern(ucs); ucs.toUTF8String(pattern); ucs.remove(); df->getPositivePrefix(ucs); if (ucs.isEmpty()) df->getPositiveSuffix(ucs); ucs.toUTF8String(positive); ucs.remove(); df->getNegativePrefix(ucs); if (ucs.isEmpty()) df->getNegativeSuffix(ucs); ucs.toUTF8String(negative); ucs.remove(); rounding = df->getRoundingIncrement(); fraction = df->getMaximumFractionDigits(); ucs = dfs->getSymbol(DecimalFormatSymbols::kDecimalSeparatorSymbol); ucs.toUTF8String(decimal); ucs.remove(); ucs = dfs->getSymbol(DecimalFormatSymbols::kGroupingSeparatorSymbol); ucs.toUTF8String(grouping); ucs.remove(); if (type == kNumberPercent) ucs = dfs->getSymbol(DecimalFormatSymbols::kPercentSymbol); else if (type == kNumberCurrency) ucs = dfs->getSymbol(DecimalFormatSymbols::kCurrencySymbol); else ucs = dfs->getSymbol(DecimalFormatSymbols::kDigitSymbol); ucs.toUTF8String(symbol); ucs.remove(); return resultInJson(pattern, symbol, fraction, rounding, positive, negative, decimal, grouping); }
std::string GlobalizationNDK::getCurrencyPattern(const std::string& args) { if (args.empty()) { slog2f(0, ID_G11N, SLOG2_ERROR, "GlobalizationNDK::getCurrencyPattern: no arguments provided!"); return errorInJson(UNKNOWN_ERROR, "No arguments provided!"); } Json::Reader reader; Json::Value root; bool parse = reader.parse(args, root); if (!parse) { slog2f(0, ID_G11N, SLOG2_ERROR, "GlobalizationNDK::getCurrencyPattern: invalid json data: %s", args.c_str()); return errorInJson(PARSING_ERROR, "Invalid json data!"); } Json::Value ccv = root["currencyCode"]; if (ccv.isNull()) { slog2f(0, ID_G11N, SLOG2_ERROR, "GlobalizationNDK::getCurrencyPattern: no currencyCode provided!"); return errorInJson(FORMATTING_ERROR, "No currencyCode provided!"); } if (!ccv.isString()) { slog2f(0, ID_G11N, SLOG2_ERROR, "GlobalizationNDK::getCurrencyPattern: invalid currencyCode type: %d!", ccv.type()); return errorInJson(FORMATTING_ERROR, "Invalid currencyCode type!"); } std::string cc = ccv.asString(); if (cc.empty()) { slog2f(0, ID_G11N, SLOG2_ERROR, "GlobalizationNDK::getCurrencyPattern: empty currencyCode!"); return errorInJson(FORMATTING_ERROR, "Empty currencyCode!"); } UnicodeString ucc = UnicodeString::fromUTF8(cc); DecimalFormat* df = 0; int count = 0; const Locale* locs = Locale::getAvailableLocales(count); for (int i = 0; i < count; ++i) { UErrorCode status = U_ZERO_ERROR; NumberFormat* nf = NumberFormat::createCurrencyInstance(*(locs + i), status); if (!nf) { slog2f(0, ID_G11N, SLOG2_ERROR, "GlobalizationNDK::getCurrencyPattern: locale %d: unable to get NumberFormat instance!", i); continue; } std::auto_ptr<NumberFormat> ndeleter(nf); const UChar* currency = nf->getCurrency(); if (!currency) { slog2f(0, ID_G11N, SLOG2_ERROR, "GlobalizationNDK::getCurrencyPattern: locale %d: failed to getCurrency!", i); continue; } if (!ucc.compare(currency, -1)) { df = (DecimalFormat*) ndeleter.release(); break; } } if (!df) return errorInJson(UNKNOWN_ERROR, "Currency not supported!"); std::auto_ptr<DecimalFormat> deleter(df); const DecimalFormatSymbols* dfs = df->getDecimalFormatSymbols(); if (!dfs) { slog2f(0, ID_G11N, SLOG2_ERROR, "GlobalizationNDK::getCurrencyPattern: unable to get DecimalFormatSymbols!"); return errorInJson(UNKNOWN_ERROR, "Failed to get DecimalFormatSymbols!"); } UnicodeString ucs; std::string pattern; df->toPattern(ucs); ucs.toUTF8String(pattern); ucs.remove(); int fraction = df->getMaximumFractionDigits(); double rounding = df->getRoundingIncrement(); std::string decimal; ucs = dfs->getSymbol(DecimalFormatSymbols::kDecimalSeparatorSymbol); ucs.toUTF8String(decimal); ucs.remove(); std::string grouping; ucs = dfs->getSymbol(DecimalFormatSymbols::kGroupingSeparatorSymbol); ucs.toUTF8String(grouping); ucs.remove(); return resultInJson(pattern, cc, fraction, rounding, decimal, grouping); }