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:35 UTC
[18/38] git commit: BB10: Implement stringToNumber.
BB10: Implement stringToNumber.
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/62037309
Tree: http://git-wip-us.apache.org/repos/asf/cordova-plugin-globalization/tree/62037309
Diff: http://git-wip-us.apache.org/repos/asf/cordova-plugin-globalization/diff/62037309
Branch: refs/heads/lyon-g11n
Commit: 62037309577aef5d9ff1f72351c7f4bcdc80f443
Parents: 51ab113
Author: Lianghui Chen <li...@blackberry.com>
Authored: Fri Jul 25 16:06:54 2014 -0400
Committer: Lianghui Chen <li...@blackberry.com>
Committed: Mon Jul 28 15:10:46 2014 -0400
----------------------------------------------------------------------
.../native/src/globalization_ndk.cpp | 95 +++++++++++++++++++-
1 file changed, 92 insertions(+), 3 deletions(-)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/cordova-plugin-globalization/blob/62037309/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 a927709..83da9a8 100644
--- a/src/blackberry10/native/src/globalization_ndk.cpp
+++ b/src/blackberry10/native/src/globalization_ndk.cpp
@@ -77,7 +77,16 @@ std::string resultInJson(int value)
return writer.write(root);
}
-std::string resultInJson(const UDate& date)
+std::string resultInJson(double value)
+{
+ Json::Value root;
+ root["result"] = value;
+
+ Json::FastWriter writer;
+ return writer.write(root);
+}
+
+std::string resultDateInJson(const UDate& date)
{
UErrorCode status = U_ZERO_ERROR;
Calendar* cal = Calendar::createInstance(status);
@@ -359,7 +368,7 @@ std::string GlobalizationNDK::stringToDate(const std::string& args)
return errorInJson(PARSING_ERROR, "Failed to parse dateString!");
}
- return resultInJson(date);
+ return resultDateInJson(date);
}
std::string GlobalizationNDK::getDatePattern(const std::string& args)
@@ -748,7 +757,87 @@ std::string GlobalizationNDK::numberToString(const std::string& args)
std::string GlobalizationNDK::stringToNumber(const std::string& args)
{
- return errorInJson(UNKNOWN_ERROR, "Not supported!");
+ if (args.empty()) {
+ slog2f(0, ID_G11N, SLOG2_ERROR, "GlobalizationNDK::stringToNumber: no arguments provided!");
+ return errorInJson(PARSING_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::stringToNumber: invalid json data: %s",
+ args.c_str());
+ return errorInJson(PARSING_ERROR, "Invalid json data!");
+ }
+
+ Json::Value sv = root["numberString"];
+ if (sv.isNull()) {
+ slog2f(0, ID_G11N, SLOG2_ERROR, "GlobalizationNDK::stringToNumber: no numberString provided!");
+ return errorInJson(FORMATTING_ERROR, "No numberString provided!");
+ }
+
+ if (!sv.isString()) {
+ slog2f(0, ID_G11N, SLOG2_ERROR, "GlobalizationNDK::stringToNumber: invalid numberString type: %d!",
+ sv.type());
+ return errorInJson(FORMATTING_ERROR, "Invalid numberString type!");
+ }
+
+ std::string str = sv.asString();
+ if (str.empty()) {
+ slog2f(0, ID_G11N, SLOG2_ERROR, "GlobalizationNDK::stringToNumber: empty numberString!");
+ return errorInJson(FORMATTING_ERROR, "Empty numberString!");
+ }
+
+ // This is the default value when no options provided.
+ ENumberType type = kNumberDecimal;
+
+ Json::Value options = root["options"];
+ std::string error;
+ if (!handleNumberOptions(options, type, error))
+ return errorInJson(PARSING_ERROR, error);
+
+ 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::stringToNumber: failed to create NumberFormat instance for type %d: %d",
+ status, type);
+ return errorInJson(UNKNOWN_ERROR, "Failed to create NumberFormat instance!");
+ }
+
+ UnicodeString uStr = UnicodeString::fromUTF8(str);
+
+ Formattable value;
+ nf->parse(uStr, value, status);
+ delete nf;
+
+ if (status != U_ZERO_ERROR && status != U_ERROR_WARNING_START) {
+ slog2f(0, ID_G11N, SLOG2_ERROR, "GlobalizationNDK::stringToNumber: failed to parse string: %s",
+ str.c_str());
+ return errorInJson(PARSING_ERROR, "Failed to parse string!");
+ }
+
+ if (!value.isNumeric()) {
+ slog2f(0, ID_G11N, SLOG2_ERROR, "GlobalizationNDK::stringToNumber: string is not numeric: %s",
+ str.c_str());
+ return errorInJson(FORMATTING_ERROR, "String is not numeric!");
+ }
+
+ return resultInJson(value.getDouble());
}
std::string GlobalizationNDK::getNumberPattern(const std::string& args)