Feb 2022 : Generic and Short 'Currency to Words' Javascript Function
Handle all Currencies in English
I have developed the following short Javascript function that can convert any Currency Number into words including decimal places (fractions).
The function uses US English Grammer for writing numbers into words.
Syntax
currencyToWords(number, currancy, format={})
number : any numeric or number in string form for large numbers
currency : object holding the currency information as follows:
{
country : the country Name (e.g.: 'US')
majorSingle: Major Unit Single Name (e.g.: 'Dollar')
majorPlural: Major Unit Plural Name (e.g.: 'Dollars')
minorSingle: Minor Sub-Unit Single (e.g.: 'Cent')
minorPlural: Minor Sub-Unit Plural (e.g.: 'Cents')
fraction : Decimal Places Number (e.g.: 2)
};
format : object holding the format for the minor (sub-units) using
'minor' parameters, as follows:
'numeric' : Sub-Units in Numeric Form (i.g. 35 Cents)
'fraction': Sub-Units in Fractional Form (i.g. 35/100 US Dollar)
empty or other (default): Sub-Units in Words Form
----------------------------------------------------------------------------
Example 1: Convert US Dollars in Default Mode
let currancy = {
country : "US", // country Name
majorSingle: "Dollar", // Major Unit Single
majorPlural: "Dollars",// Major Unit Plural
minorSingle: "Cent", // Minor Sub-Unit Single
minorPlural: "Cents", // Minor Sub-Unit Plural
fraction : 2, // Decimal Places
};
console.log(currencyToWords(50,currancy));
// Fifty US Dollars
console.log(currencyToWords(20.23,currancy));
// Twenty US Dollars, and Twenty-Three Cents
console.log(currencyToWords(0.99,currancy));
// Zero US Dollar, and Ninety-Nine Cents
console.log(currencyToWords(100.2,currancy));
// One Hundred US Dollars, and Twenty Cents
console.log(currencyToWords(1.01,currancy));
// One US Dollar, and One Cent
console.log(currencyToWords(0.01,currancy));
// Zero US Dollar, and One Cent
console.log(currencyToWords(520.01,currancy));
// Five Hundred Twenty US Dollars, and One Cent
Example 2: Convert US Dollars with Sub-Units (Minor) in 'numeric' Format
console.log(currencyToWords(50,currancy,{minor:"numeric"}));
// Fifty US Dollars
console.log(currencyToWords(20.23,currancy,{minor:"numeric"}));
// Twenty US Dollars, and 23 Cents
console.log(currencyToWords(0.99,currancy,{minor:"numeric"}));
// Zero US Dollar, and 99 Cents
console.log(currencyToWords(100.2,currancy,{minor:"numeric"}));
// One Hundred US Dollars, and 20 Cents
console.log(currencyToWords(1.01,currancy,{minor:"numeric"}));
// One US Dollar, and 1 Cent
console.log(currencyToWords(0.01,currancy,{minor:"numeric"}));
// Zero US Dollar, and 1 Cent
console.log(currencyToWords(520.01,currancy,{minor:"numeric"}));
// Five Hundred Twenty US Dollars, and 1 Cent
Example 2: Convert US Dollars with Sub-Units (Minor) in 'fraction' Format
console.log(currencyToWords(50,currancy,{minor:"fraction"}));
// Fifty US Dollars
console.log(currencyToWords(20.23,currancy,{minor:"fraction"}));
// Twenty, and 23/100 US Dollars
console.log(currencyToWords(0.99,currancy,{minor:"fraction"}));
// Zero, and 99/100 US Dollar
console.log(currencyToWords(100.2,currancy,{minor:"fraction"}));
// One Hundred, and 20/100 US Dollars
console.log(currencyToWords(1.01,currancy,{minor:"fraction"}));
// One, and 1/100 US Dollar
console.log(currencyToWords(0.01,currancy,{minor:"fraction"}));
// Zero, and 1/100 US Dollar
console.log(currencyToWords(520.01,currancy,{minor:"fraction"}));
// Five Hundred Twenty, and 1/100 US Dollars
Changing the Currency
You can specify the name of the country, major and minor currency names (singular and plural).
The fraction
is the number of decimal places for the minor (sub-unit). For US Dollars it is 2 for a Euro: 2, for Kuwait Dinar: 3, or Omani Riyal: 3, etc.
If you want to have a currency without the country name, then set the country name to an empty string ''.
/********************************************************
* @function : currencyToWords(number, currancy, [format])
* @purpose : Converts Currency to Words
* @version : 1.00
* @author : Mohsen Alyafei
* @licence : MIT
* @date : 27 Feb 2022
* @param : number [required] numeric or string
* curr [required] object description
* format [optional] with the following parameters:
* minor: 'numeric' or 'fraction' or none (default)
* @returns : {string} Currency String in Words
********************************************************/
function currencyToWords(num=0, curr, format={}) {
format=format.minor;
format ??= "";
num=(num+="").split((0.1).toLocaleString().substring(1,2));
let frc = (num[1]+"000").substring(0,curr.fraction), a=", and ",
cc = " "+curr.country+(curr.country?" ":"")+(num[0]>1?curr.majorPlural:curr.majorSingle),
out = numToWords(num[0])+(format=="fraction" && num[1]?"":cc);
if (num[1]) {
let sub=frc>1?curr.minorPlural:curr.minorSingle;
if (format=="numeric") out+=a+(+frc)+" "+sub;
else if (format=="fraction") out+=a+(+frc)+"/1"+"0".repeat(curr.fraction)+cc;
else out+=a+numToWords(frc)+" "+sub;
}
return out;
//----------------------------------------------------------------
function numToWords(num = 0) {
if (num == 0) return "Zero";
num= ("0".repeat(2*(num+="").length%3)+num).match(/.{3}/g);
let out="",
T10s=["","One","Two","Three","Four","Five","Six","Seven","Eight","Nine","Ten","Eleven","Twelve","Thirteen","Fourteen","Fifteen","Sixteen","Seventeen","Eighteen","Nineteen"],
T20s=["","","Twenty","Thirty","Forty","Fifty","Sixty","Seventy","Eighty","Ninety"],
sclT=["","Thousand","Million","Billion","Trillion","Quadrillion"];
return num.forEach((n,i) => {
if (+n) {
let h=+n[0], t=+n.substring(1), scl=sclT[num.length-i-1];
out+=(out?" ":"")+(h?T10s[h]+" Hundred":"")+(h && t?" ":"")+(t<20?T10s[t]:T20s[+n[1]]+(+n[2]?"-":"")+T10s[+n[2]]);
out+=(out && scl?" ":"")+scl;
}}),out;
}
}
//----------------------------------------------------------------
//=========================================
// Test Code
//=========================================
let currancy = {
country : "US", // country Name
majorSingle: "Dollar", // Major Unit Single
majorPlural: "Dollars",// Major Unit Plural
minorSingle: "Cent", // Minor Sub-Unit Single
minorPlural: "Cents", // Minor Sub-Unit Plural
fraction : 2, // Decimal Places
};
// default. sub-units in word format
console.log(currencyToWords(50,currancy));
console.log(currencyToWords(20.23,currancy));
console.log(currencyToWords(0.99,currancy));
console.log(currencyToWords(100.2,currancy));
console.log(currencyToWords(1.01,currancy));
console.log(currencyToWords(0.01,currancy));
console.log(currencyToWords(520.01,currancy));
console.log("-".repeat(50));
// sub-units in numeric format
console.log(currencyToWords(50,currancy,{minor:"numeric"}));
console.log(currencyToWords(20.23,currancy,{minor:"numeric"}));
console.log(currencyToWords(0.99,currancy,{minor:"numeric"}));
console.log(currencyToWords(100.2,currancy,{minor:"numeric"}));
console.log(currencyToWords(1.01,currancy,{minor:"numeric"}));
console.log(currencyToWords(0.01,currancy,{minor:"numeric"}));
console.log(currencyToWords(520.01,currancy,{minor:"numeric"}));
console.log("-".repeat(50));
// sub-units in fractional format
console.log(currencyToWords(50,currancy,{minor:"fraction"}));
console.log(currencyToWords(20.23,currancy,{minor:"fraction"}));
console.log(currencyToWords(0.99,currancy,{minor:"fraction"}));
console.log(currencyToWords(100.2,currancy,{minor:"fraction"}));
console.log(currencyToWords(1.01,currancy,{minor:"fraction"}));
console.log(currencyToWords(0.01,currancy,{minor:"fraction"}));
console.log(currencyToWords(520.01,currancy,{minor:"fraction"}));
console.log("-".repeat(50));
currancy = {
country : "Omani", // country Name
majorSingle: "Riyal", // Major Unit Single
majorPlural: "Riyals",// Major Unit Plural
minorSingle: "Baisa", // Minor Sub-Unit Single
minorPlural: "Baisa", // Minor Sub-Unit Plural
fraction : 3, // Decimal Places
};
console.log(currencyToWords(50,currancy,{minor:"fraction"}));
console.log(currencyToWords(200.234,currancy,{minor:"fraction"}));
console.log(currencyToWords(2000.99,currancy,{minor:"fraction"}));
console.log(currencyToWords(30100.2,currancy,{minor:"fraction"}));
console.log(currencyToWords(3456.001,currancy,{minor:"fraction"}));
console.log(currencyToWords(500.01,currancy,{minor:"fraction"}));
console.log(currencyToWords(22.1,currancy,{minor:"fraction"}));
console.log(currencyToWords(0.45,currancy,{minor:"fraction"}));