/** * 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; }