Public
Edited
Jul 7, 2024
Paused
Comments locked
Insert cell
Insert cell
Insert cell
Insert cell
Insert cell
Insert cell
Insert cell
Insert cell
Insert cell
Insert cell
/**
* Converts positive integers like '42' into words like 'forty-two'
*
* @param {number} value - The integer value to create words for
* @returns {string} The integer value converted to words
*/
spellNumber = {
let [_00, ..._000] = [
...new Map([...scales.entries()].sort((a, b) => a[0] - b[0])).values()
];

yield function (value = 0) {
if (+value === 0) {
return numerals.get(0);
}

if (value < 0 || value > Number.MAX_SAFE_INTEGER || value % 1 !== 0) {
throw RangeError(
`Only integers between 0 and ${Number.MAX_SAFE_INTEGER} are allowed`
);
}

const input = value + "";
const output = [];

for (let k = input.length - 1, n = 0; k >= 0; k--, n++) {
const key = +input[k];
const position = n % 3;

if (0 === key && position) {
continue;
}

switch (position) {
case 0:
if (n) {
-1 !== _000.indexOf(output[0]) && output.shift();
output.unshift(scales.get(n));
}
key > 0 && output.unshift(numerals.get(key));
break;

case 1: {
let [word, lookup] = [output.shift(), tens.get(key)];

if (typeof lookup === "string") {
if (-1 === digits.indexOf(word)) {
/* reinject word if defined */
word && output.unshift(word);
} else {
/* append word */
lookup += "-" + word;
}
} else {
/* spell number in range 10..19 */
lookup = lookup.get(word);
}

output.unshift(lookup);
break;
}

case 2:
output.unshift([numerals.get(key), " ", _00].join(""));
break;
}
}

/* thank you, Nicholas C. Zakas! - mg */

return output.join(" ");
};
}
Insert cell
Insert cell
Insert cell
Insert cell
Insert cell
scales = new Map([
[15, "quadrillion"],
[12, "trillion"],
[9, "billion"],
[6, "million"],
[3, "thousand"],
[2, "hundred"]
])
Insert cell
tens = new Map([
[
1,
new Map(
[
"ten",
"eleven",
"twelve",
"thirteen",
"fourteen",
"fifteen",
"sixteen",
"seventeen",
"eighteen",
"nineteen"
].map((value, i) => [i ? digits[i] : void 0, value])
)
],
[2, "twenty"],
[3, "thirty"],
[4, "forty"],
[5, "fifty"],
[6, "sixty"],
[7, "seventy"],
[8, "eighty"],
[9, "ninety"]
])
Insert cell
Insert cell
Insert cell
Insert cell
Insert cell

Purpose-built for displays of data

Observable is your go-to platform for exploring data and creating expressive data visualizations. Use reactive JavaScript notebooks for prototyping and a collaborative canvas for visual data exploration and dashboard creation.
Learn more