Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Number to String - How to turn 150 into "One Hundred and Fifty"

Just wondering if there are any libraries that can easily turn numbers into their string representations in javascript, jquery, php, python etc...

Ex: I need to turn 1,210 into "One Thousand Two Hundred and Ten".

Is there a name for this procedure?

like image 444
apchait Avatar asked Nov 05 '22 18:11

apchait


1 Answers

Javascript Solution. Supports all integers from negative infinity to infinity:

var GetWord;
(function(){
    GetWord = function (number) {//number must be an integer
        return (function f(number){
            var output = [];
            var is_negative = number < 0;
            number = Math.abs(number);

            var chunks = [];
            for (var x = count_names.length - 1, limit = 0; x >= limit; --x) {
                var chunk = Math.floor(number / counts[x]);
                if (chunk !== 0) {
                    output.push(GetWord(chunk) + " " + count_names[x]);
                }
                chunks[x] = chunk;
                number -= chunk * counts[x];
            }
            if (number !== 0) {
                if (number <= 19) {
                    output.push(number_names[number]);
                } else {
                    var tens = Math.floor(number / 10);
                    number -= tens * 10;
                    if (number === 0) {
                        output.push(number_names2[tens - 2]);
                    } else {
                        output.push(number_names2[tens - 2] + " " + GetWord(number));
                    }
                }
            }
            if (output.length > 2) {
                for (var x = 0, limit = output.length - 1; x < limit; ++x) {
                    output[x] += ","
                }
            }
            if (output.length > 1) {
                var ubound = output.length - 1;
                output[output.length] = output[ubound];
                output[ubound] = "and";
            }
            if (is_negative) {
                output.splice(0, 0, "negative");
            } 
            return output;
        })(number).join(" ");
    };
    var number_names = ["zero", "one", "two", "three", "four", "five", "six", "seven", "eight", "nine", "ten", "eleven", "twelve", "thirteen", "fourteen", "fifteen", "sixteen", "seventeen", "eighteen", "nineteen"];
    var number_names2 = ["twenty", "thirty", "forty", "fifty", "sixty", "seventy", "eighty", "ninety", "hundred"]
    var count_names = ["hundred", "thousand", "million", "billion", "trillion", "quadrillion", "quintillion", "sextillion", "septillion", "octillion", "nonillion", "decillion", "undecillion", "duodecillion", "tredecillion", "quattuordecillion", "quindecillion", "sexdecillion", "septendecillion", "octodecillion", "novemdecillion", "vigintillion"];
    var counts = [100];
    for (var x = counts.length, limit = count_names.length; x < limit; ++x) {
       counts.push(Math.pow(1000, x));
    }
})();

Usage:

GetWord(1210); gives one thousand, two hundred, and ten

GetWord(2147483647); gives two billion, one hundred and forty seven million, four hundred and eighty three thousand, six hundred, and forty seven

GetWord(-123876124); gives negative one hundred and twenty three million, eight hundred and seventy six thousand, one hundred, and twenty four

If you need them caps, simply change those array templates into the "capped" form.

like image 66
Pacerier Avatar answered Nov 09 '22 14:11

Pacerier