angular.js/i18n/src/parser.js

64 lines
1.6 KiB
JavaScript

/**
* 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] ? groups[1].length : 0;
p.lgSize = (groups[2] || groups[1]) ? (groups[2] || groups[1]).length : 0;
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;
}