/*
Convert numbers to English words in JavaScript
----------------------------------------------
Supports numbers from 0 to 999,999,999,999,999.
Strategy:
- Break the number into named groups: trillions, billions, millions,
thousands, hundreds.
- Convert each 0–999 group using a helper function.
- Append group names ("trillion", "billion", etc.) when needed.
- Build the final string using an array and join() for efficiency.
*/
const ONES = [
"zero", "one", "two", "three", "four",
"five", "six", "seven", "eight", "nine",
"ten", "eleven", "twelve", "thirteen", "fourteen",
"fifteen", "sixteen", "seventeen", "eighteen", "nineteen"
];
const TENS_WORDS = [
"", "", "twenty", "thirty", "forty",
"fifty", "sixty", "seventy", "eighty", "ninety"
];
/*
appendWord:
Adds a word to the output array.
*/
function appendWord(out, word) {
if (word) out.push(word);
}
/*
convertHundreds:
Converts numbers from 0 to 999 into words.
*/
function convertHundreds(n, out) {
if (n === 0) return;
if (n >= 100) {
appendWord(out, ONES[Math.floor(n / 100)]);
appendWord(out, "hundred");
n %= 100;
if (n > 0) appendWord(out, "and");
}
if (n >= 20) {
appendWord(out, TENS_WORDS[Math.floor(n / 10)]);
if (n % 10 !== 0) appendWord(out, ONES[n % 10]);
} else if (n > 0) {
appendWord(out, ONES[n]);
}
}
/*
numberToWords:
Converts any number from 0 to 999,999,999,999,999 into English words.
*/
function numberToWords(num) {
if (num === 0) return "zero";
const out = [];
const trillions = Math.floor(num / 1_000_000_000_000);
const billions = Math.floor(num / 1_000_000_000) % 1000;
const millions = Math.floor(num / 1_000_000) % 1000;
const thousands = Math.floor(num / 1_000) % 1000;
const hundreds = num % 1000;
if (trillions > 0) {
convertHundreds(trillions, out);
appendWord(out, "trillion");
}
if (billions > 0) {
convertHundreds(billions, out);
appendWord(out, "billion");
}
if (millions > 0) {
convertHundreds(millions, out);
appendWord(out, "million");
}
if (thousands > 0) {
convertHundreds(thousands, out);
appendWord(out, "thousand");
}
if (hundreds > 0) {
convertHundreds(hundreds, out);
}
return out.join(" ");
}
/*
main:
Demonstrates usage with multiple test numbers.
*/
function main() {
const tests = [
1_234,
12_345,
123_456,
1_234_567,
123_456_789,
12_345_678_901,
1_234_567_890_123,
999_999_999_999_999
];
for (const n of tests) {
console.log(`${n} -> ${numberToWords(n)}`);
}
}
main();
/*
run:
1234 -> one thousand two hundred and thirty four
12345 -> twelve thousand three hundred and forty five
123456 -> one hundred and twenty three thousand four hundred and fifty six
1234567 -> one million two hundred and thirty four thousand five hundred and sixty seven
123456789 -> one hundred and twenty three million four hundred and fifty six thousand seven hundred and eighty nine
12345678901 -> twelve billion three hundred and forty five million six hundred and seventy eight thousand nine hundred and one
1234567890123 -> one trillion two hundred and thirty four billion five hundred and sixty seven million eight hundred and ninety thousand one hundred and twenty three
999999999999999 -> nine hundred and ninety nine trillion nine hundred and ninety nine billion nine hundred and ninety nine million nine hundred and ninety nine thousand nine hundred and ninety nine
*/