|
| 1 | +/*eslint complexity: ["error", 10]*/ |
| 2 | +export default numberToString |
| 3 | + |
| 4 | +/** |
| 5 | + * Original source: https://stackoverflow.com/questions/5529934/javascript-numbers-to-words |
| 6 | + * |
| 7 | + * Converts an int to its string representation |
| 8 | + * |
| 9 | + * @param {Number} number - input integer (MAX_SAFE_INTEGER) |
| 10 | + * @return {String} - String representation of the integer |
| 11 | + */ |
| 12 | + |
| 13 | +const stringLookup = [ |
| 14 | + {key: 1000000000000000, value: 'quadrillion'}, |
| 15 | + {key: 1000000000000, value: 'trillion'}, |
| 16 | + {key: 1000000000, value: 'billion'}, |
| 17 | + {key: 1000000, value: 'million'}, |
| 18 | + {key: 1000, value: 'thousand'}, |
| 19 | + {key: 100, value: 'hundred'}, |
| 20 | + {key: 90, value: 'ninety'}, |
| 21 | + {key: 80, value: 'eighty'}, |
| 22 | + {key: 70, value: 'seventy'}, |
| 23 | + {key: 60, value: 'sixty'}, |
| 24 | + {key: 50, value: 'fifty'}, |
| 25 | + {key: 40, value: 'forty'}, |
| 26 | + {key: 30, value: 'thirty'}, |
| 27 | + {key: 20, value: 'twenty'}, |
| 28 | + {key: 19, value: 'nineteen'}, |
| 29 | + {key: 18, value: 'eighteen'}, |
| 30 | + {key: 17, value: 'seventeen'}, |
| 31 | + {key: 16, value: 'sixteen'}, |
| 32 | + {key: 15, value: 'fifteen'}, |
| 33 | + {key: 14, value: 'fourteen'}, |
| 34 | + {key: 13, value: 'thirteen'}, |
| 35 | + {key: 12, value: 'twelve'}, |
| 36 | + {key: 11, value: 'eleven'}, |
| 37 | + {key: 10, value: 'ten'}, |
| 38 | + {key: 9, value: 'nine'}, |
| 39 | + {key: 8, value: 'eight'}, |
| 40 | + {key: 7, value: 'seven'}, |
| 41 | + {key: 6, value: 'six'}, |
| 42 | + {key: 5, value: 'five'}, |
| 43 | + {key: 4, value: 'four'}, |
| 44 | + {key: 3, value: 'three'}, |
| 45 | + {key: 2, value: 'two'}, |
| 46 | + {key: 1, value: 'one'}, |
| 47 | +] |
| 48 | + |
| 49 | +function numberToString(number) { |
| 50 | + if (number <= 0 || number > Number.MAX_SAFE_INTEGER) { |
| 51 | + return 'Number needs to be grater than 0 or less than 2^53-1.' |
| 52 | + } |
| 53 | + let result = '' |
| 54 | + |
| 55 | + for (const n of stringLookup) { |
| 56 | + if (number >= n.key) { |
| 57 | + if (number < 100) { |
| 58 | + result += n.value |
| 59 | + number -= n.key |
| 60 | + number > 0 ? result += ' ' : result |
| 61 | + } else { |
| 62 | + const t = Math.floor(number / n.key) |
| 63 | + const d = number % n.key |
| 64 | + return d > 0 ? `${numberToString(t)} ${n.value} ${numberToString(d)}` : `${numberToString(t)} ${n.value}` |
| 65 | + } |
| 66 | + } |
| 67 | + } |
| 68 | + return result |
| 69 | +} |
0 commit comments