Skip to content

Instantly share code, notes, and snippets.

@chrhicks
Created January 31, 2014 12:03
Show Gist options
  • Save chrhicks/8730814 to your computer and use it in GitHub Desktop.
Save chrhicks/8730814 to your computer and use it in GitHub Desktop.
A Pen by Chris Hicks.
<p>Given any integer print an English phrase that describes the integer. (e.g. "One Thousand, Three Hundred Twenty Four").</p>
<div id="log"></div>

integer to english

Given any integer print an English phrase that describes the integer. (e.g. "One Thousand, Three Hundred Twenty Four").

A Pen by Chris Hicks on CodePen.

License.

function log(text) {
$('#log').append(text + "<br>\n");
}
function int2Eng(num) {
'use strict';
var
ones = ["Zero", "One", "Two", "Three", "Four", "Five", "Six", "Seven", "Eight", "Nine"],
teens = ["Ten", "Eleven", "Twelve", "Thirteen", "Fourteen", "Fifteen", "Sixteen", "Seventeen", "Eighteen", "Nineteen"],
tens = ["", "", "Twenty", "Thirty", "Fourty", "Fifty", "Sixty", "Seventy", "Eighty", "Ninety"],
numberGroups = ["", "Thousand", "Million", "Billion"],
/* Convert 12300 to 300,12 so we can work with the order of magnitudes easier.
* This makes 300 the first coma separated group, so we know not to append a
* number group like 'Thousand' or 'Million'. 12 is the second group, so we
* know it will be in the 'Thousand' range and we can append that to the
* phrase 'Twelve' to get 'Tweleve Thousand'
*/
reversed = reverseStr(num.toString()),
groups = reversed.match(/\d{1,3}/g),group,
output = [];
// Blow up if not a number
// Blow up if negative
// Blow up if greater than 999,999,999,999
log(" ");
log('num: ' + num);
// Use groups length to count down the order of magnitude.
// Print number for 12, group 1 -> Tweleve Thousand
// Print number for 300, group 0 -> Three Hundred
for(group = groups.length - 1; group >= 0; group--) {
output.push(printNumber(reverseStr(groups[group]), group));
}
// join the two phrases together...
log(output.join(', '));
function printNumber (number, numberGroup) {
var length = number.length,
output = [];
if (length === 1) {
output.push(singleDigit(number));
}
if (length === 2) {
output.push(doubleDigit(number));
}
if (length === 3) {
output.push(tripleDigit(number));
}
output.push(numberGroups[numberGroup])
return output.join(' ');
}
function singleDigit(number) {
return ones[number.charAt(0)];
}
function doubleDigit(number) {
var output = [];
if (number == "00") { // We don't say Zero Zero or Five Hundred Zero
return '';
} else if (number.charAt(0) === '1') { // Cover the things between 9 and 20
output.push(teens[number.charAt(1)]);
} else { // Everything else is easy.
output.push(tens[number.charAt(0)]);
output.push(ones[number.charAt(1)]);
}
return output.join(' ');
}
function tripleDigit(number) {
var output = [];
output.push(singleDigit(number.substring(0,1)));
output.push("Hundred");
output.push(doubleDigit(number.substring(1,3)));
return output.join(' ');
}
function reverseStr(str) {
return str.split('').reverse().join('');
}
}
int2Eng(1); // One
int2Eng(10); // Ten
int2Eng(12); // Twelve
int2Eng(21); // Twenty One
int2Eng(123); // One Hundred Twenty Three
int2Eng(300); // Three Hundred
int2Eng(301); // Three Hundred One
int2Eng(1234); // One Thousand, Two Hundred Thirty Four
int2Eng(12345); // Twelve Thousand, Three Hundred Fourty Five
int2Eng(12312); // Twelve Thousand, Three Hundred Twelve
int2Eng(123456); // One Hundred Twenty Three Thousand, Four Hundred Fifty Six
int2Eng(3744892348); // Three Billion, Seven Hundred Fourty Four Million, Eight Hundred Ninety Two Thousand, Three Hundred Fourty Eight
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment