Created
January 18, 2023 04:22
-
-
Save basil2style/90a3caac019ab99cd5a098003f025700 to your computer and use it in GitHub Desktop.
Google app script to convert number to words
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
// 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