* Parse a number (as a string) into three components that can be used * for formatting the number. * * (Significant bits of this parse algorithm came from https://github.com/MikeMcl/big.js/) * * @param {string} numStr The number to parse * @return {object} An object describing this number, co
(numStr)
| 19080 | * |
| 19081 | */ |
| 19082 | function parse(numStr) { |
| 19083 | var exponent = 0, digits, numberOfIntegerDigits; |
| 19084 | var i, j, zeros; |
| 19085 | |
| 19086 | // Decimal point? |
| 19087 | if ((numberOfIntegerDigits = numStr.indexOf(DECIMAL_SEP)) > -1) { |
| 19088 | numStr = numStr.replace(DECIMAL_SEP, ''); |
| 19089 | } |
| 19090 | |
| 19091 | // Exponential form? |
| 19092 | if ((i = numStr.search(/e/i)) > 0) { |
| 19093 | // Work out the exponent. |
| 19094 | if (numberOfIntegerDigits < 0) numberOfIntegerDigits = i; |
| 19095 | numberOfIntegerDigits += +numStr.slice(i + 1); |
| 19096 | numStr = numStr.substring(0, i); |
| 19097 | } else if (numberOfIntegerDigits < 0) { |
| 19098 | // There was no decimal point or exponent so it is an integer. |
| 19099 | numberOfIntegerDigits = numStr.length; |
| 19100 | } |
| 19101 | |
| 19102 | // Count the number of leading zeros. |
| 19103 | for (i = 0; numStr.charAt(i) == ZERO_CHAR; i++) {/* jshint noempty: false */} |
| 19104 | |
| 19105 | if (i == (zeros = numStr.length)) { |
| 19106 | // The digits are all zero. |
| 19107 | digits = [0]; |
| 19108 | numberOfIntegerDigits = 1; |
| 19109 | } else { |
| 19110 | // Count the number of trailing zeros |
| 19111 | zeros--; |
| 19112 | while (numStr.charAt(zeros) == ZERO_CHAR) zeros--; |
| 19113 | |
| 19114 | // Trailing zeros are insignificant so ignore them |
| 19115 | numberOfIntegerDigits -= i; |
| 19116 | digits = []; |
| 19117 | // Convert string to array of digits without leading/trailing zeros. |
| 19118 | for (j = 0; i <= zeros; i++, j++) { |
| 19119 | digits[j] = +numStr.charAt(i); |
| 19120 | } |
| 19121 | } |
| 19122 | |
| 19123 | // If the number overflows the maximum allowed digits then use an exponent. |
| 19124 | if (numberOfIntegerDigits > MAX_DIGITS) { |
| 19125 | digits = digits.splice(0, MAX_DIGITS - 1); |
| 19126 | exponent = numberOfIntegerDigits - 1; |
| 19127 | numberOfIntegerDigits = 1; |
| 19128 | } |
| 19129 | |
| 19130 | return { d: digits, e: exponent, i: numberOfIntegerDigits }; |
| 19131 | } |
| 19132 | |
| 19133 | /** |
| 19134 | * Round the parsed number to the specified number of decimal places |
no test coverage detected