numbernamer
Version:
Name large numbers up to 10e30000!
134 lines • 2.5 kB
JavaScript
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';
}
}