Is there a built in function of JavaScript to convert a string into a particular locale (Euro in my case)?
E.g. 50.00
should get converted to 50,0
I am working on an international site which deals with multiple currencies.
I didn't want to deal with setting the Locale every time I wanted to display a currency, so instead I made a prototype which formats the currency to the appropriate locale. It is transparent in its conversions so you can customize it to your needs as well.
Number.prototype.formatMoney = function(moneySymbol, decimalCharacter, thousandsCharacter, decimalPlaces, symbolLocation)
{
var symbolLocation = (symbolLocation == undefined || symbolLocation < 1 || symbolLocation == "begin")?"begin":"end";
var decimalPlaces = isNaN(decimalPlaces = Math.abs(decimalPlaces)) ? 2 : decimalPlaces;
var thisNumber = parseFloat(this, decimalPlaces);
var decimalCharacter = decimalCharacter == undefined ? "." : decimalCharacter;
var thousandsCharacter = thousandsCharacter == undefined ? "," : thousandsCharacter;
//var pm = thisNumber < 0 ? "-" : "";
var pm = "";
var pmB = thisNumber < 0 ? "(" : "";
var pmE = thisNumber < 0 ? ")" : "";
var i = parseInt(thisNumber = Math.abs(+thisNumber || 0)) + "";
var j = (j = i.length) > 3 ? j % 3 : 0;
var retString = pmB;
retString += ((symbolLocation == "begin")?((moneySymbol)?moneySymbol+"":""):"");
retString += pm;
retString += (j ? i.substr(0, j) + thousandsCharacter : "")
retString += i.substr(j).replace(/(\d{3})(?=\d)/g, "$1" + thousandsCharacter);
//alert((decimalPlaces ? decimalCharacter + (Math.ceil(Math.abs(thisNumber - i)*Math.pow(10, decimalPlaces))/Math.pow(10, decimalPlaces)).toFixed(decimalPlaces).slice(decimalPlaces) : "") + '\n' + Math.abs(thisNumber - i).toFixed(6));
retString += (decimalPlaces ? decimalCharacter + (Math.ceil(Math.abs(thisNumber - i).toFixed(6)*Math.pow(10, decimalPlaces))/Math.pow(10, decimalPlaces)).toFixed(decimalPlaces).slice(decimalPlaces) : "");
retString += ((symbolLocation == "end")?((moneySymbol)?moneySymbol+"":""):"");
retString += pmE;
return retString;
};
Number.prototype.formatMoneyInternational = function(languageCode, inputCode)
{
var languageCode = languageCode == undefined ? 'en_us' : languageCode;
var inputCode = inputCode == undefined ? languageCode : inputCode;
var currencies = {
'float': {'symbol':null, 'symbolPosition': 'end', 'decimal':'.', 'comma': ''}, //Float
//Arabic - Saudi Arabia ?(1025): Sorry, the server does not support this locale
//Arabic - Iraq ?(2049): Sorry, the server does not support this locale
//Arabic - Egypt ?(3073): Sorry, the server does not support this locale
//Arabic - Algeria ?(5121): Sorry, the server does not support this locale
'bg': {'symbol':' BGN', 'symbolPosition': 'end', 'decimal':',', 'comma': ' '}, //Bulgarian
'ca': {'symbol':' €', 'symbolPosition': 'end', 'decimal':',', 'comma': '.'}, //Catalan
//Chinese - Traditional (1028): Sorry, the server does not support this locale
//Chinese - Simplified (2052): Sorry, the server does not support this locale
'cs': {'symbol':' Kc', 'symbolPosition': 'end', 'decimal':',', 'comma': ' '}, //Czech
'da': {'symbol':'kr ', 'symbolPosition': 'begin', 'decimal':',', 'comma': '.'}, //Danish
'de': {'symbol':' €', 'symbolPosition': 'end', 'decimal':',', 'comma': '.'}, //German - Germany
'de_au': {'symbol':' €', 'symbolPosition': 'end', 'decimal':',', 'comma': '.'}, //German - Austrian
'de_lu': {'symbol':' €', 'symbolPosition': 'end', 'decimal':',', 'comma': '.'}, //German - Luxembourg
'el': {'symbol':' €', 'symbolPosition': 'end', 'decimal':',', 'comma': '.'}, //Greek
'en_us': {'symbol':'$', 'symbolPosition': 'begin', 'decimal':'.', 'comma': ','}, //English - United States
'en_gb': {'symbol':'£ ', 'symbolPosition': 'begin', 'decimal':'.', 'comma': ','}, //English - United Kingdom
'en_au': {'symbol':'$ ', 'symbolPosition': 'begin', 'decimal':'.', 'comma': ','}, //English - Australia
'en_ca': {'symbol':'$', 'symbolPosition': 'begin', 'decimal':'.', 'comma': ','}, //English - Canadian
'en_ie': {'symbol':'€ ', 'symbolPosition': 'begin', 'decimal':'.', 'comma': ','}, //English - Irish
'es_mx': {'symbol':'$ ', 'symbolPosition': 'begin', 'decimal':'.', 'comma': ','}, //Spanish - Mexico
'es': {'symbol':' €', 'symbolPosition': 'end', 'decimal':',', 'comma': '.'}, //Spanish - International
'fi': {'symbol':' €', 'symbolPosition': 'end', 'decimal':',', 'comma': ' '}, //Finnish
'fr': {'symbol':' €', 'symbolPosition': 'end', 'decimal':',', 'comma': ' '}, //French - France
'fr_ca': {'symbol':' $', 'symbolPosition': 'end', 'decimal':',', 'comma': ' '}, //French - Canadian
'fr_ch': {'symbol':'SFr. ', 'symbolPosition': 'begin', 'decimal':'.', 'comma': '\''}, //French - Swiss
//Hebrew ?(1037): Sorry, the server does not support this locale
'hu': {'symbol':' Ft', 'symbolPosition': 'end', 'decimal':',', 'comma': ' '}, //Hungarian
'it': {'symbol':'€ ', 'symbolPosition': 'begin', 'decimal':',', 'comma': '.'}, //Italian - Italy
'it_ch': {'symbol':'₣ ', 'symbolPosition': 'begin', 'decimal':'.', 'comma': '\''}, //Italian - Swiss
'ja': {'symbol':'¥ ', 'symbolPosition': 'begin', 'decimal':'.', 'comma': '\''}, //Japanese
//Korean (1042): Sorry, the server does not support this locale
'nl': {'symbol':'€ ', 'symbolPosition': 'begin', 'decimal':',', 'comma': '.'}, //Dutch - Netherlands
'no': {'symbol':'kr ', 'symbolPosition': 'begin', 'decimal':',', 'comma': ' '}, //Norwegian
'pl': {'symbol':' zl', 'symbolPosition': 'end', 'decimal':',', 'comma': ' '}, //Polish
'pt_br': {'symbol':'R$ ', 'symbolPosition': 'begin', 'decimal':',', 'comma': '.'}, //Portuguese - Brazil
'pt': {'symbol':' €', 'symbolPosition': 'end', 'decimal':',', 'comma': '.'}, //Portuguese - Standard
'ro': {'symbol':' lei', 'symbolPosition': 'end', 'decimal':',', 'comma': '.'}, //Romanian
'ru': {'symbol':' p.', 'symbolPosition': 'end', 'decimal':',', 'comma': ' '}, //Russian
'hr': {'symbol':' kn', 'symbolPosition': 'end', 'decimal':',', 'comma': '.'}, //Croatian
'sr': {'symbol':' Din.', 'symbolPosition': 'end', 'decimal':',', 'comma': '.'}, //Serbian - Latin
//'sr': {'symbol':' ???. ', 'symbolPosition': 'end', 'decimal':',', 'comma': '.'}, //Serbian - Cyrillic
'sv': {'symbol':' kr', 'symbolPosition': 'end', 'decimal':',', 'comma': '.'}, //Swedish
//Thai (1054): Sorry, the server does not support this locale
'tr': {'symbol':' TL', 'symbolPosition': 'end', 'decimal':',', 'comma': '.'}, //Turkish
'id': {'symbol':' Rp.', 'symbolPosition': 'begin', 'decimal':' ', 'comma': '.'}, //Indonesian
'uk': {'symbol':' rpH.', 'symbolPosition': 'end', 'decimal':',', 'comma': ' '}, //Ukranian
'be': {'symbol':' p.', 'symbolPosition': 'end', 'decimal':',', 'comma': ' '}, //Belausian
'sl': {'symbol':' SIT', 'symbolPosition': 'end', 'decimal':',', 'comma': '.'}, //Slovenian
'et': {'symbol':' kr', 'symbolPosition': 'end', 'decimal':'.', 'comma': ' '}, //Estonian
'lv': {'symbol':'Ls ', 'symbolPosition': 'begin', 'decimal':',', 'comma': ' '}, //Latvian
'lt': {'symbol':' Lt', 'symbolPosition': 'end', 'decimal':',', 'comma': '.'}, //Lithuanian
//Farsi ?(1065): Sorry, the server does not support this locale
//Vietnamese (1066): Sorry, the server does not support this locale
'af': {'symbol':'R ', 'symbolPosition': 'begin', 'decimal':'.', 'comma': ','}, //Afrikaans
'fo': {'symbol':'kr ', 'symbolPosition': 'begin', 'decimal':',', 'comma': '.'} //Faeroese
};
var currencyString = this+"";
if(currencies[languageCode])
{
//alert(currencyString.replace(currencies[inputCode].comma, '').replace(currencies[inputCode].decimal, '.').replace(/[^\d\.\,\-]/g, ''));
var currencyNumber = parseFloat(currencyString.replace(currencies[inputCode].comma, '').replace(currencies[inputCode].decimal, '.').replace(/[^\d\.\,\-]/g, ''));
return currencyNumber.formatMoney(currencies[languageCode].symbol, currencies[languageCode].decimal, currencies[languageCode].comma, 2, currencies[languageCode].symbolPosition);
}
else
{
var currencyNumber = parseFloat(currencyString.replace(currencies['en_us'].decimal, '.').replace(currencies['en_us'].comma, '').replace(/[^\d\.\,\-]/g, ''));
alert('Error: ' + languageCode + ' country code unknown.');
return currencyNumber.formatMoney(currencies['en_us'].symbol, currencies['en_us'].decimal, currencies['en_us'].comma, 2, currencies['en_us'].symbolPosition);
}
}
String.prototype.formatMoneyInternational = Number.prototype.formatMoneyInternational;
For javascript use the accounting library http://openexchangerates.github.io/accounting.js/ Then you can do:
// Default usage:
accounting.formatMoney(12345678); // $12,345,678.00
// European formatting (custom symbol and separators), can also use options object as second parameter:
accounting.formatMoney(4999.99, "€", 2, ".", ","); // €4.999,99
// Negative values can be formatted nicely:
accounting.formatMoney(-500000, "£ ", 0); // £ -500,000
// Simple `format` string allows control of symbol position (%v = value, %s = symbol):
accounting.formatMoney(5318008, { symbol: "GBP", format: "%v %s" }); // 5,318,008.00 GBP
The accepted answer from Matt Ball is wrong - dunno why nobody haven't noticed. There is no such function as String.toLocaleString()
[ref]! Therefore when Number.toFixed()
returns String, the consequent toLocaleString()
does nothing. So you won't get localized number, just the product of toFixed()
function.
WRONG (don't do it like this):
var i = 1234.123;
alert(i.toFixed(2).toLocaleString() + ' €'); // ALWAYS alerts '1234.12 €' (no locale formatting)
Suggestion how to do it right:
You may use jQuery plugin like NumberFormatter.