* 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 de
(numStr)
| 20051 | * |
| 20052 | */ |
| 20053 | function parse(numStr) { |
| 20054 | var exponent = 0, digits, numberOfIntegerDigits; |
| 20055 | var i, j, zeros; |
| 20056 | |
| 20057 | // Decimal point? |
| 20058 | if ((numberOfIntegerDigits = numStr.indexOf(DECIMAL_SEP)) > -1) { |
| 20059 | numStr = numStr.replace(DECIMAL_SEP, ''); |
| 20060 | } |
| 20061 | |
| 20062 | // Exponential form? |
| 20063 | if ((i = numStr.search(/e/i)) > 0) { |
| 20064 | // Work out the exponent. |
| 20065 | if (numberOfIntegerDigits < 0) numberOfIntegerDigits = i; |
| 20066 | numberOfIntegerDigits += +numStr.slice(i + 1); |
| 20067 | numStr = numStr.substring(0, i); |
| 20068 | } else if (numberOfIntegerDigits < 0) { |
| 20069 | // There was no decimal point or exponent so it is an integer. |
| 20070 | numberOfIntegerDigits = numStr.length; |
| 20071 | } |
| 20072 | |
| 20073 | // Count the number of leading zeros. |
| 20074 | for (i = 0; numStr.charAt(i) == ZERO_CHAR; i++); |
| 20075 | |
| 20076 | if (i == (zeros = numStr.length)) { |
| 20077 | // The digits are all zero. |
| 20078 | digits = [0]; |
| 20079 | numberOfIntegerDigits = 1; |
| 20080 | } else { |
| 20081 | // Count the number of trailing zeros |
| 20082 | zeros--; |
| 20083 | while (numStr.charAt(zeros) == ZERO_CHAR) zeros--; |
| 20084 | |
| 20085 | // Trailing zeros are insignificant so ignore them |
| 20086 | numberOfIntegerDigits -= i; |
| 20087 | digits = []; |
| 20088 | // Convert string to array of digits without leading/trailing zeros. |
| 20089 | for (j = 0; i <= zeros; i++ , j++) { |
| 20090 | digits[j] = +numStr.charAt(i); |
| 20091 | } |
| 20092 | } |
| 20093 | |
| 20094 | // If the number overflows the maximum allowed digits then use an exponent. |
| 20095 | if (numberOfIntegerDigits > MAX_DIGITS) { |
| 20096 | digits = digits.splice(0, MAX_DIGITS - 1); |
| 20097 | exponent = numberOfIntegerDigits - 1; |
| 20098 | numberOfIntegerDigits = 1; |
| 20099 | } |
| 20100 | |
| 20101 | return { d: digits, e: exponent, i: numberOfIntegerDigits }; |
| 20102 | } |
| 20103 | |
| 20104 | /** |
| 20105 | * Round the parsed number to the specified number of decimal places |
no test coverage detected