aboutsummaryrefslogtreecommitdiffstats
path: root/i18n/src/parser.js
blob: db31aeefa966a68b7e24701d53507d62a82f4ca8 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
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;
}