aboutsummaryrefslogtreecommitdiffstats
path: root/i18n/src/parser.js
diff options
context:
space:
mode:
Diffstat (limited to 'i18n/src/parser.js')
-rw-r--r--i18n/src/parser.js64
1 files changed, 64 insertions, 0 deletions
diff --git a/i18n/src/parser.js b/i18n/src/parser.js
new file mode 100644
index 00000000..db31aeef
--- /dev/null
+++ b/i18n/src/parser.js
@@ -0,0 +1,64 @@
+/**
+* A simple parser to parse a number format into a pattern object
+*/
+
+exports.parsePattern = parsePattern;
+
+var PATTERN_SEP = ';',
+ DECIMAL_SEP = '.',
+ GROUP_SEP = ',',
+ ZERO = '0',
+ DIGIT = '#';
+
+/**
+ * main funciton for parser
+ * @param str {string} pattern to be parsed (e.g. #,##0.###).
+ */
+function parsePattern(pattern) {
+ var p = {
+ minInt: 1,
+ minFrac: 0,
+ macFrac: 0,
+ posPre: '',
+ posSuf: '',
+ negPre: '',
+ negSuf: '',
+ gSize: 0,
+ lgSize: 0
+ };
+
+ var parts = pattern.split(PATTERN_SEP),
+ positive = parts[0],
+ negative = parts[1];
+
+ var parts = positive.split(DECIMAL_SEP),
+ integer = parts[0],
+ fraction = parts[1];
+
+ p.posPre = integer.substr(0, integer.indexOf(DIGIT));
+
+ for (var i = 0; i < fraction.length; i++) {
+ var ch = fraction.charAt(i);
+ if (ch == ZERO) p.minFrac = p.maxFrac = i + 1;
+ else if (ch == DIGIT) p.maxFrac = i + 1;
+ else p.posSuf += ch;
+ }
+
+ var groups = integer.split(GROUP_SEP);
+ p.gSize = groups[1].length;
+ p.lgSize = (groups[2] || groups[1]).length;
+
+ if (negative) {
+ var trunkLen = positive.length - p.posPre.length - p.posSuf.length,
+ pos = negative.indexOf(DIGIT);
+
+ p.negPre = negative.substr(0, pos).replace(/\'/g, '');
+ p.negSuf = negative.substr(pos + trunkLen).replace(/\'/g, '');
+ } else {
+ // hardcoded '-' sign is fine as all locale use '-' as MINUS_SIGN. (\u2212 is the same as '-')
+ p.negPre = p.posPre + '-';
+ p.negSuf = p.posSuf;
+ }
+
+ return p;
+}