【发布时间】:2011-03-15 15:46:06
【问题描述】:
是否有 JavaScript 的内置函数可以将字符串转换为特定的语言环境(在我的例子中是欧元)?
例如50.00 应该转换为 50,00 €。
【问题讨论】:
-
'Euro' 不是语言环境。语言环境是例如German of Germany 或 de-DE(语言标记为 Ietf Bcp 47)。
标签: javascript numbers currency
是否有 JavaScript 的内置函数可以将字符串转换为特定的语言环境(在我的例子中是欧元)?
例如50.00 应该转换为 50,00 €。
【问题讨论】:
标签: javascript numbers currency
我在this page找到了一种方法。
您可以在toLocaleString 之前不使用toFixed。 toFixed 返回一个字符串,toLocaleString 应该得到一个数字。但是您可以使用toLocaleString 传递选项对象,选项minimumFractionDigits 可以帮助您实现toFixed 的功能。
50.toLocaleString('de-DE', {
style: 'currency',
currency: 'EUR',
minimumFractionDigits: 2
});
检查您可以使用此函数传递的所有其他选项。
【讨论】:
options for toLocaleString 现在适用于所有浏览器 (developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/…)。但是您不需要单独声明minimumFractionDigits。它只适用于style 和currency。
50.00 是一个无单位值。您可以做的最好的是将50.00 转换为50,00,然后自己附加€。因此,只需使用Number.toLocaleString()。
var i = 50.00;
alert(i.toLocaleString() + ' €'); // alerts '50.00 €' or '50,00 €'
【讨论】:
50。
price.toLocaleString(.culture, { minimumFractionDigits: 2, maximumFractionDigits: 2 });
.culture 部分。
ECMAScript Internationalization API 中描述了与语言环境相关的功能。
要将浮点数 50.0 转换为字符串 50,00 €(使用“de-DE”语言环境),您需要这样写:
new Intl.NumberFormat("de-DE", {style: "currency", currency: "EUR"}).format(50.0)
目前所有主流浏览器均提供此 API。
有关国际化 API 的数字格式化功能的更多信息,您应该阅读article at MDN。
【讨论】:
我在一个处理多种货币的国际网站上工作。
我不想在每次想要显示货币时都设置语言环境,因此我制作了一个原型,将货币格式化为适当的语言环境。它的转换是透明的,因此您也可以根据自己的需要对其进行自定义。
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;
【讨论】:
Matt Ball 接受的答案是错误 - 不知道为什么没有人注意到。 没有String.toLocaleString()[ref]这样的函数! 所以当Number.toFixed()返回String时,后续的toLocaleString()什么都不做。所以你不会得到本地化的数字,只是toFixed()函数的乘积。
错误(不要这样做):
var i = 1234.123;
alert(i.toFixed(2).toLocaleString() + ' €'); // ALWAYS alerts '1234.12 €' (no locale formatting)
建议如何正确操作:
你可以使用像NumberFormatter这样的jQuery插件。
【讨论】:
内置,是和否。有Number.toLocaleString(),但它取决于系统的语言环境。
但是,有些库为此提供了模块。例如,MooTools 的Locale.Number 允许您将数字转换为不同的语言环境(添加您自己的语言环境很简单)。
Locale.use("EU");
var inEuros = (50).formatCurrency(); // € 50,00
如果您想在之后打印 € 符号,您可以简单地创建自己的语言环境:
Locale.define('EU-suffix', 'Number', {
currency: {
suffix: ' €'
}
}).inherit('EU', 'Number');
【讨论】:
其他一些答案还可以,但我会推荐一个不同的库,NumeralJS 而不是 Number.toLocaleString 因为后者在所有浏览器中都不受广泛支持(即使是新版本的 safari 也会中断)。 NumeralJS 非常强大,它支持任何你想做的将数字转换为字符串的事情。
首先,设置语言(我选择的是法语),然后格式化:
numeral.language('fr');
numeral(50.00).format('0.00 $');
输出:
"50,00 €"
该网站解释得很好,并且有大量示例。
【讨论】:
对于javascript使用会计库http://openexchangerates.github.io/accounting.js/然后你可以这样做:
// 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
【讨论】: