Есть ли в JavaScript функция для преобразования значений в определенные форматы локали?

Есть ли встроенная функция JavaScript для преобразования строки в конкретную локаль (в моем случае евро)?

Например. 50.00 должно быть преобразовано в 50,00 €.


person Murtaza Mandvi    schedule 15.03.2011    source источник
comment
«Евро» — это не локаль. Локаль, например. Немецкий из Германии или de-DE (тег языка от Ietf Bcp 47).   -  person Sebastian Zartner    schedule 22.02.2015


Ответы (9)


50.00 — безразмерное значение. Лучшее, что вы можете сделать, это преобразовать 50.00 в 50,00, а затем добавить самостоятельно. Поэтому просто используйте Number.toLocaleString().

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

Демонстрация →

Много актуальных вопросов:

person Matt Ball    schedule 15.03.2011
comment
Это не работает. После вызова toFixed(2) возвращается строка. Таким образом, вы вызываете toLocaleString() для строки, а не для целого числа, что не будет включать, например, изменение «12,34» на «12,34» на французском языке. - person user959690; 25.06.2014
comment
Результат .toFixed() можно проанализировать обратно в число с плавающей запятой, тогда он работает, например. parseFloat((12.3456).toFixed(2)).toLocaleString() - person TvdH; 02.07.2014
comment
@TvdH, к сожалению, это все еще не работает для 50. - person Matt Ball; 02.07.2014
comment
@Matt: Вы, конечно, правы - поскольку 50 и 50.00 для JavaScript одинаковы. Это усложняет дело, я придумал это: var number = 50, scale = 2; console.log((((Math.round(number * Math.pow(10, scale)) * 10) + 1) / Math.pow(10, scale + 1)) .toLocaleString() .slice(0, scale == 0 ? -2 : -1)); - person TvdH; 02.07.2014
comment
Это не работает из коробки — toFixed() возвращает строку, а toLocalString ожидает число. Используйте 1_ - person Morten Holmgaard; 08.09.2014
comment
@MortenHolmgaard Это приводит к Uncaught SyntaxError: Unexpected token . . Я думаю, что это часть .culture. - person Martin; 18.04.2016

Я нашел способ сделать это на этой странице< /а>.

Вы можете toLocaleString не использовать toFixed перед этим. toFixed возвращает строку, toLocaleString должно получить число. Но вы можете передать объект опций с помощью toLocaleString, опция minimumFractionDigits может помочь вам с функциональностью toFixed.

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

Проверьте все другие параметры, которые вы можете передать с помощью этой функции.

person Willem de Wit    schedule 10.03.2014

В API интернационализации ECMAScript описаны функции, связанные с региональными настройками.

Чтобы преобразовать число с плавающей запятой 50.0 в строку 50,00 € (используя локаль de-DE), вам нужно написать следующее:

new Intl.NumberFormat("de-DE", {style: "currency", currency: "EUR"}).format(50.0)

Этот API доступен во всех современных основных браузерах.

Для получения дополнительной информации о функциях форматирования чисел в API интернационализации вы должны прочитать статья на MDN.

person Sebastian Zartner    schedule 21.02.2015
comment
Теперь это отличное решение с современным JavaScript. Есть ли обратный способ сделать это? - person Con Antonakos; 11.10.2017

Я работаю над международным сайтом, который работает с несколькими валютами.

Я не хотел иметь дело с настройкой локали каждый раз, когда я хотел отобразить валюту, поэтому вместо этого я сделал прототип, который форматирует валюту в соответствии с соответствующей локалью. Он прозрачен в своих преобразованиях, поэтому вы также можете настроить его под свои нужды.

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;
person Luke    schedule 05.05.2011

Принятый ответ от Мэтта Болла неправильный - не знаю, почему никто этого не заметил. Нет такой функции, как String.toLocaleString() [ref]! Поэтому, когда Number.toFixed() возвращает строку, последующий toLocaleString() ничего не делает. Таким образом, вы не получите локализованный номер, а только произведение функции toFixed().

НЕПРАВИЛЬНО (не делайте так):

var i = 1234.123;
alert(i.toFixed(2).toLocaleString() + ' €'); // ALWAYS alerts '1234.12 €' (no locale formatting)

Предложение, как сделать это правильно:

Вы можете использовать подключаемый модуль jQuery, например NumberFormatter.

person Jan Peša    schedule 11.02.2013
comment
Итак, как сделать это? в обычном JS - person Breaking not so bad; 19.05.2014
comment
Еще одна причина не использовать W3Schools в качестве эталона. - person dfmiller; 23.02.2016

Встроенная и да и нет. Есть Number.toLocaleString(), но это зависит от языкового стандарта системы.

Однако есть некоторые библиотеки, в которых есть модули для этого. MooTools Locale.Number, например, позволяет преобразовать число в разные локали (добавление собственной локали тривиально).

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

демонстрация jsFiddle


Если вы хотите, чтобы знак € печатался после, вы можете просто создать свою собственную локаль:

Locale.define('EU-suffix', 'Number', {
    currency: {
        suffix: ' €'
    }
}).inherit('EU', 'Number');
person Andrew Moore    schedule 15.03.2011

Некоторые другие ответы в порядке, но я бы порекомендовал другую библиотеку, NumeralJS вместо Number.toLocaleString, поскольку последняя не поддерживается. широко во всех браузерах (ломается даже на новых версиях сафари). NumeralJS действительно мощный и поддерживает все, что вы хотите сделать с преобразованием чисел в строки.

Сначала установите язык (я выбрал французский), а затем отформатируйте его:

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

Выходы:

"50,00 €"

Веб-сайт объясняет это довольно хорошо и содержит множество примеров.

person Ben Schenker    schedule 13.11.2014

Для 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
person spacebiker    schedule 16.02.2017

Я подготовил небольшую библиотеку для работы с форматированием валюты - money

money(1000.5, 'EUR');   // -> 1 000.50 €
money(1000.5, 'USD');   // -> $1,000.50
money(1000.5, 'PLN');   // -> 1 000,50 zł

Поддерживаемая валюта (коды ISO): PLN, EUR, USD, GBP, JPY, CZK, SEK

person patrykgruszka    schedule 26.07.2017
comment
GPB должен быть GBP (британский фунт). Вы также можете исправить это на своей странице GitHub, как в документации, так и в коде. - person Fabio says Reinstate Monica; 27.07.2017
comment
Спасибо @FabioTurati, исправлена ​​опечатка в комментарии, коде и файле readme. - person patrykgruszka; 27.07.2017