Is there a functionality in JavaScript to convert values into specific locale formats?

前端 未结 9 1787
花落未央
花落未央 2020-12-03 06:32

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

相关标签:
9条回答
  • 2020-12-03 07:22

    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':'&#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;
    
    0 讨论(0)
  • 2020-12-03 07:22

    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
    
    0 讨论(0)
  • 2020-12-03 07:23

    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.

    0 讨论(0)
提交回复
热议问题