【问题标题】:Is there a functionality in JavaScript to convert values into specific locale formats?JavaScript 中是否有将值转换为特定语言环境格式的功能?
【发布时间】:2011-03-15 15:46:06
【问题描述】:

是否有 JavaScript 的内置函数可以将字符串转换为特定的语言环境(在我的例子中是欧元)?

例如50.00 应该转换为 50,00 €

【问题讨论】:

  • 'Euro' 不是语言环境。语言环境是例如German of Germany 或 de-DE(语言标记为 Ietf Bcp 47)。

标签: javascript numbers currency


【解决方案1】:

我在this page找到了一种方法。

您可以在toLocaleString 之前不使用toFixedtoFixed 返回一个字符串,toLocaleString 应该得到一个数字。但是您可以使用toLocaleString 传递选项对象,选项minimumFractionDigits 可以帮助您实现toFixed 的功能。

50.toLocaleString('de-DE', {
    style: 'currency', 
    currency: 'EUR', 
    minimumFractionDigits: 2 
});

检查您可以使用此函数传递的所有其他选项。

【讨论】:

  • 酷,但浏览器对选项的兼容性似乎很低(不支持 IE 11 和 Safari)
  • 和 Firefox 一样:异常:SyntaxError:标识符在数字文字之后立即开始
  • 这应该是要走的路。上面的 cmets 已过时,因为 options for toLocaleString 现在适用于所有浏览器 (developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/…)。但是您不需要单独声明minimumFractionDigits。它只适用于stylecurrency
【解决方案2】:

50.00 是一个无单位值。您可以做的最好的是将50.00 转换为50,00,然后自己附加。因此,只需使用Number.toLocaleString()

var i = 50.00;
alert(i.toLocaleString() + ' €'); // alerts '50.00 €' or '50,00 €'

Demo →

很多相关问题:

【讨论】:

  • 这不起作用。调用 toFixed(2) 后返回一个字符串。因此,您在不是整数的字符串上调用 toLocaleString(),例如,这不包括将法语中的 '12.34' 更改为 '12,34'。
  • .toFixed() 的结果可以解析回一个浮点数,然后它就可以工作了,例如parseFloat((12.3456).toFixed(2)).toLocaleString()
  • @TvdH 不幸的是,这仍然不适用于50
  • 这不能开箱即用 - toFixed() 返回一个字符串,而 toLocalString 需要一个数字。使用:price.toLocaleString(.culture, { minimumFractionDigits: 2, maximumFractionDigits: 2 });
  • @MortenHolmgaard 这会导致 "Uncaught SyntaxError: Unexpected token ." 。我认为这是.culture 部分。
【解决方案3】:

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

【讨论】:

  • 这是现代 JavaScript 的绝佳解决方案。有相反的方法吗?
【解决方案4】:

我在一个处理多种货币的国际网站上工作。

我不想在每次想要显示货币时都设置语言环境,因此我制作了一个原型,将货币格式化为适当的语言环境。它的转换是透明的,因此您也可以根据自己的需要对其进行自定义。

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':'&#8355; ',       '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;

【讨论】:

    【解决方案5】:

    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插件。

    【讨论】:

    • 那么“如何”?在常规 JS 中
    • 不使用 W3Schools 作为参考的另一个原因。
    【解决方案6】:

    内置,是和否。有Number.toLocaleString(),但它取决于系统的语言环境。

    但是,有些库为此提供了模块。例如,MooToolsLocale.Number 允许您将数字转换为不同的语言环境(添加您自己的语言环境很简单)。

    Locale.use("EU");
    var inEuros = (50).formatCurrency(); // € 50,00
    

    jsFiddle Demo


    如果您想在之后打印 € 符号,您可以简单地创建自己的语言环境:

    Locale.define('EU-suffix', 'Number', {
        currency: {
            suffix: ' €'
        }
    }).inherit('EU', 'Number');
    

    【讨论】:

      【解决方案7】:

      其他一些答案还可以,但我会推荐一个不同的库,NumeralJS 而不是 Number.toLocaleString 因为后者在所有浏览器中都不受广泛支持(即使是新版本的 safari 也会中断)。 NumeralJS 非常强大,它支持任何你想做的将数字转换为字符串的事情。

      首先,设置语言(我选择的是法语),然后格式化:

      numeral.language('fr');
      numeral(50.00).format('0.00 $');
      

      输出:

      "50,00 €"
      

      该网站解释得很好,并且有大量示例。

      【讨论】:

        【解决方案8】:

        对于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
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2014-03-09
          相关资源
          最近更新 更多