diff options
Diffstat (limited to 'i18n/src/parser.js')
| -rw-r--r-- | i18n/src/parser.js | 64 |
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; +} |
