You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@cordova.apache.org by bh...@apache.org on 2014/07/30 21:06:30 UTC
[13/38] git commit: BB10: Implement getNumberPattern.
BB10: Implement getNumberPattern.
Project: http://git-wip-us.apache.org/repos/asf/cordova-plugin-globalization/repo
Commit: http://git-wip-us.apache.org/repos/asf/cordova-plugin-globalization/commit/80d58219
Tree: http://git-wip-us.apache.org/repos/asf/cordova-plugin-globalization/tree/80d58219
Diff: http://git-wip-us.apache.org/repos/asf/cordova-plugin-globalization/diff/80d58219
Branch: refs/heads/lyon-g11n
Commit: 80d58219e0824b5288529abb3bcecc4b7a70abb0
Parents: ddc1fa2
Author: Lianghui Chen <li...@blackberry.com>
Authored: Mon Jul 28 12:08:30 2014 -0400
Committer: Lianghui Chen <li...@blackberry.com>
Committed: Mon Jul 28 15:10:46 2014 -0400
----------------------------------------------------------------------
.../native/src/globalization_ndk.cpp | 124 ++++++++++++++++++-
1 file changed, 123 insertions(+), 1 deletion(-)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/cordova-plugin-globalization/blob/80d58219/src/blackberry10/native/src/globalization_ndk.cpp
----------------------------------------------------------------------
diff --git a/src/blackberry10/native/src/globalization_ndk.cpp b/src/blackberry10/native/src/globalization_ndk.cpp
index 83da9a8..e377097 100644
--- a/src/blackberry10/native/src/globalization_ndk.cpp
+++ b/src/blackberry10/native/src/globalization_ndk.cpp
@@ -20,6 +20,7 @@
#include <sys/slog2.h>
#include <unicode/calendar.h>
#include <unicode/datefmt.h>
+#include <unicode/decimfmt.h>
#include <unicode/dtfmtsym.h>
#include <unicode/smpdtfmt.h>
#include "globalization_ndk.hpp"
@@ -136,6 +137,27 @@ std::string resultInJson(const std::string& pattern, const std::string& timezone
return writer.write(root);
}
+std::string resultInJson(const std::string& pattern, const std::string& symbol, int fraction,
+ double rounding, const std::string& positive, const std::string& negative,
+ const std::string& decimal, const std::string& grouping)
+{
+ Json::Value result;
+ result["pattern"] = pattern;
+ result["symbol"] = symbol;
+ result["fraction"] = fraction;
+ result["rounding"] = rounding;
+ result["positive"] = positive;
+ result["negative"] = negative;
+ result["decimal"] = decimal;
+ result["grouping"] = grouping;
+
+ Json::Value root;
+ root["result"] = result;
+
+ Json::FastWriter writer;
+ return writer.write(root);
+}
+
GlobalizationNDK::GlobalizationNDK(GlobalizationJS *parent) {
m_pParent = parent;
}
@@ -842,7 +864,107 @@ std::string GlobalizationNDK::stringToNumber(const std::string& args)
std::string GlobalizationNDK::getNumberPattern(const std::string& args)
{
- return errorInJson(UNKNOWN_ERROR, "Not supported!");
+ // 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!");
+ }
+
+ 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) {
+ delete nf;
+ 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();
+
+ delete nf;
+
+ return resultInJson(pattern, symbol, fraction, rounding, positive, negative, decimal, grouping);
}
std::string GlobalizationNDK::getCurrencyPattern(const std::string& args)