UNPKG

numbernamer

Version:

Name large numbers up to 10e30000!

134 lines 2.5 kB
exports = { nameNumber: (zeros) => { // Base -illions (don't follow the rules for larger -illions) if (zeros < 3) return; if (zeros < 6) return 'thousand'; if (zeros < 9) return 'million'; if (zeros < 12) return 'billion'; if (zeros < 15) return 'trillion'; if (zeros < 18) return 'quadrillion'; if (zeros < 21) return 'quintillion'; if (zeros < 24) return 'sextillion'; if (zeros < 27) return 'septillion'; if (zeros < 30) return 'octillion'; if (zeros < 33) return 'nonillion'; // Vars const _NAMES = [ [ '', 'un', 'do', 'tre', 'quattuor', 'quin', 'se', 'septe', 'octo', 'nove' ], [ '', 'deci', 'viginti', 'triginta', 'quadraginta', 'quinquaginta', 'sexaginta', 'septuaginta', 'octoginta', 'nonaginta' ], [ '', 'centi', 'ducenti', 'trecenti', 'quadringenti', 'quingenti', 'sescenti', 'septingenti', 'octingenti', 'nongenti' ], [ '', 'milli', 'billi', 'trilli', 'quadrilli', 'quintilli', 'sextilli', 'septilli', 'octilli', 'nonilli' ] ] const _NAMERULES = [ [ [], [], [], ['s'], [], [], ['s', 'x'], ['m', 'n'], [], ['m', 'n'] ], [ [], ['n'], ['m', 's'], ['n', 's'], ['n', 's'], ['n', 's'], ['n'], ['n'], ['m', 'x'], [] ], [ [], ['n', 'x'], ['n'], ['n', 's'], ['n', 's'], ['n', 's'], ['n'], ['n'], ['m', 'x'], [] ], [ [], [], [], [], [], [], [], [], [], [] ] ] let e = ('' + Math.floor((zeros - 3) / 3)).split('').reverse(); let out = []; for (let i = e.length - 1; i > -1; i--){ if (!_NAMES[i]) throw new Error('Number too large'); out[i] = _NAMES[i][e[i]]; if (i === 0){ const lastRules = _NAMERULES[1][e[e.length - 1]]; const onesRules = _NAMERULES[i][e[i]]; for (let j = 0; j < onesRules.length; j++){ if (lastRules.indexOf(onesRules[j]) > -1)out[i] += lastRules[lastRules.indexOf(onesRules[j])]; } } } out = out.join(''); if (out.charAt(out.length - 1) === 'a') out = out.substring(0, out.length - 1) + 'i'; out = out.substring(0, 1).toUpperCase() + out.substring(1, out.length); return out + 'llion\n'; } }