Skip to content

Instantly share code, notes, and snippets.

@basil2style
Created January 18, 2023 04:22
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save basil2style/90a3caac019ab99cd5a098003f025700 to your computer and use it in GitHub Desktop.
Save basil2style/90a3caac019ab99cd5a098003f025700 to your computer and use it in GitHub Desktop.
Google app script to convert number to words
// JS code from https://stackoverflow.com/a/30522105
/**
* Convert number to words.
* @param {number} input the number for conversion.
* @return number in words.
* @customfunction
*/
function NUMWORDS(n) {
var string = n.toString(), units, tens, scales, start, end, chunks, chunksLen, chunk, ints, i, word, words, and = 'and';
/* Remove spaces and commas */
string = string.replace(/[, ]/g, "");
/* Is number zero? */
if (parseInt(string) === 0) {
return 'zero';
}
/* Array of units as words */
units = ['', 'one', 'two', 'three', 'four', 'five', 'six', 'seven', 'eight', 'nine', 'ten', 'eleven', 'twelve', 'thirteen', 'fourteen', 'fifteen', 'sixteen', 'seventeen', 'eighteen', 'nineteen'];
/* Array of tens as words */
tens = ['', '', 'twenty', 'thirty', 'forty', 'fifty', 'sixty', 'seventy', 'eighty', 'ninety'];
/* Array of scales as words */
scales = ['', 'thousand', 'million', 'billion', 'trillion', 'quadrillion', 'quintillion', 'sextillion', 'septillion', 'octillion', 'nonillion', 'decillion', 'undecillion', 'duodecillion', 'tredecillion', 'quatttuor-decillion', 'quindecillion', 'sexdecillion', 'septen-decillion', 'octodecillion', 'novemdecillion', 'vigintillion', 'centillion'];
/* Split user argument into 3 digit chunks from right to left */
start = string.length;
chunks = [];
while (start > 0) {
end = start;
chunks.push(string.slice((start = Math.max(0, start - 3)), end));
}
/* Check if function has enough scale words to be able to stringify the user argument */
chunksLen = chunks.length;
if (chunksLen > scales.length) {
return '';
}
/* Stringify each integer in each chunk */
words = [];
for (i = 0; i < chunksLen; i++) {
chunk = parseInt(chunks[i]);
if (chunk) {
/* Split chunk into array of individual integers */
ints = chunks[i].split('').reverse().map(parseFloat);
/* If tens integer is 1, i.e. 10, then add 10 to units integer */
if (ints[1] === 1) {
ints[0] += 10;
}
/* Add scale word if chunk is not zero and array item exists */
if ((word = scales[i])) {
words.push(word);
}
/* Add unit word if array item exists */
if ((word = units[ints[0]])) {
words.push(word);
}
/* Add tens word if array item exists */
if ((word = tens[ints[1]])) {
words.push(word);
}
/* Add 'and' string after units or tens integer if: */
if (ints[0] || ints[1]) {
/* Chunk has a hundreds integer or chunk is the first of multiple chunks */
// if (ints[2] || !i && chunksLen) {
// words.push(and);
// }
if (ints[2] || (i + 1) < chunksLen) { words.push(and); and = ''; }
}
/* Add hundreds word if array item exists */
if ((word = units[ints[2]])) {
words.push(word + ' hundred');
}
}
}
return words.reverse().join(' ');
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment