Як відформатувати числа як рядок валюти?


1845

Я хотів би відформатувати ціну в JavaScript. Я хотів би функцію, яка бере floatаргумент і повертає такий stringформат:

"$ 2,500.00"

Який найкращий спосіб зробити це?


8
Там буде ніякої вбудованої функції formatNumberв JavaScript
— НЕ zerkms

500
Будь ласка, будь-хто, хто читає це в майбутньому, не використовує плаваючий знак для зберігання валюти. Ви втратите точність та дані. Ви повинні зберігати його як цілу кількість центів (або копійки тощо), а потім конвертувати до виведення.
— Філіп Уайтхаус

8
@ user1308743 Float не зберігає десяткових знаків. Він зберігає числа за допомогою значення, бази та зміщення. 0,01 фактично не є репрезентативним. Дивіться: en.wikipedia.org/wiki/Floating_point#Accuracy_problems
— Філіп Уайтхаус

6
@ user1308743: Уявіть, що ви представляєте дуже велику кількість (скажімо, ви щасливий хлопець, і це баланс вашого банківського рахунку). Ви дійсно хочете втратити гроші через дефіцит точності?
— ereOn

163
То чому ніхто ще не запропонував таке? (2500) .toLocaleString ("en-GB", {стиль: "валюта", валюта: "GBP", мінімальнийFractionDigits: 2}) developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/…
— Nick Grealy

Відповіді:


1792

Number.prototype.toFixed

Це рішення сумісне з кожним головним браузером:

  const profits = 2489.8237;

  profits.toFixed(3) //returns 2489.824 (rounds up)
  profits.toFixed(2) //returns 2489.82
  profits.toFixed(7) //returns 2489.8237000 (pads the decimals)

Все, що вам потрібно - це додати символ валюти (наприклад "$" + profits.toFixed(2)), і ви матимете свою суму в доларах.

Спеціальна функція

Якщо вам потрібно використовувати ,між кожною цифрою, ви можете використовувати цю функцію:

function formatMoney(number, decPlaces, decSep, thouSep) {
decPlaces = isNaN(decPlaces = Math.abs(decPlaces)) ? 2 : decPlaces,
decSep = typeof decSep === "undefined" ? "." : decSep;
thouSep = typeof thouSep === "undefined" ? "," : thouSep;
var sign = number < 0 ? "-" : "";
var i = String(parseInt(number = Math.abs(Number(number) || 0).toFixed(decPlaces)));
var j = (j = i.length) > 3 ? j % 3 : 0;

return sign +
	(j ? i.substr(0, j) + thouSep : "") +
	i.substr(j).replace(/(\decSep{3})(?=\decSep)/g, "$1" + thouSep) +
	(decPlaces ? decSep + Math.abs(number - i).toFixed(decPlaces).slice(2) : "");
}

document.getElementById("b").addEventListener("click", event => {
  document.getElementById("x").innerText = "Result was: " + formatMoney(document.getElementById("d").value);
});
<label>Insert your amount: <input id="d" type="text" placeholder="Cash amount" /></label>
<br />
<button id="b">Get Output</button>
<p id="x">(press button to get output)</p>

Використовуйте його так:

(123456789.12345).formatMoney(2, ".", ",");

Якщо ви завжди збираєтесь використовувати "." і ',', ви можете залишити їх у виклику методу, і метод за замовчуванням буде призначений для вас.

(123456789.12345).formatMoney(2);

Якщо у вашій культурі два символи перевернуті (тобто європейці), і ви хочете скористатися типовими параметрами, просто вставте наступні два рядки formatMoneyметоду:

    d = d == undefined ? "," : d, 
    t = t == undefined ? "." : t, 

Спеціальна функція (ES6)

Якщо ви можете використовувати сучасний синтаксис ECMAScript (тобто через Babel), замість цього ви можете використовувати цю більш просту функцію:

function formatMoney(amount, decimalCount = 2, decimal = ".", thousands = ",") {
  try {
    decimalCount = Math.abs(decimalCount);
    decimalCount = isNaN(decimalCount) ? 2 : decimalCount;

    const negativeSign = amount < 0 ? "-" : "";

    let i = parseInt(amount = Math.abs(Number(amount) || 0).toFixed(decimalCount)).toString();
    let j = (i.length > 3) ? i.length % 3 : 0;

    return negativeSign + (j ? i.substr(0, j) + thousands : '') + i.substr(j).replace(/(\d{3})(?=\d)/g, "$1" + thousands) + (decimalCount ? decimal + Math.abs(amount - i).toFixed(decimalCount).slice(2) : "");
  } catch (e) {
    console.log(e)
  }
};
document.getElementById("b").addEventListener("click", event => {
  document.getElementById("x").innerText = "Result was: " + formatMoney(document.getElementById("d").value);
});
<label>Insert your amount: <input id="d" type="text" placeholder="Cash amount" /></label>
<br />
<button id="b">Get Output</button>
<p id="x">(press button to get output)</p>


26
насамперед відмінний, стислий код. однак, якщо ви американці, вам слід змінити типові параметри dта tбути, .і ,відповідно, щоб не потрібно їх вказувати кожен раз. Також я рекомендую змінити початок returnвиписки, щоб прочитати: return s + '$' + [rest]інакше ви не отримаєте знак долара.
— Джейсон

744
Не впевнені, чому люди вважають цей код прекрасним. Це нерозбірливо. Здається, це працює добре, але це не красиво.
— usr

86
Чи скопійована ця функція formatMoney з якогось деіндефікованого коду JavaScript? Ви не можете опублікувати оригінал? Що означають змінні c, d, i, j, n, s і t? Судячи з кількості опублікованих коментарів та коментарів, я можу припустити, що цей код був скріплений копією на виробничих веб-сайтах скрізь ... Удачі, зберігаючи код, якщо в ньому є помилка якогось дня!
— zuallauz

259
"поезія"? Більше схоже на незрозумілість. Це не код гольфу; використовувати трохи білого простору. Власні імена вар також не зашкодять.
— keithjgrant


1511

Міжнародний номер

У Javascript є формат чисел (частина інтернаціоналізації API).

// Create our number formatter.
var formatter = new Intl.NumberFormat('en-US', {
  style: 'currency',
  currency: 'USD',
});

formatter.format(2500); /* $2,500.00 */

JS скрипка

Використовуйте undefinedзамість першого аргументу ( 'en-US'у прикладі) для використання системного локалу (місце користувача, якщо код працює у браузері). Подальше пояснення коду локалі .

Ось список кодів валюти .

Intl.NumberFormat vs Number.prototype.toLocaleString

Заключна примітка, порівнюючи це зі старшими. toLocaleString. Вони обидва пропонують однакову функціональність. Однак toLocaleString у своїх старих втіленнях (pre-Intl) насправді не підтримує локалі : він використовує системний локал. Тому переконайтеся, що ви використовуєте правильну версію ( MDN пропонує перевірити наявністьIntl ). Також продуктивність обох є однаковою для одного елемента, але якщо у вас є багато цифр для форматування, використання Intl.NumberFormat~ в 70 разів швидше. Ось як користуватися toLocaleString:

(2500).toLocaleString('en-US', {
  style: 'currency',
  currency: 'USD',
}); /* $2,500.00 */

Деякі нотатки про підтримку браузера

  • Підтримка веб-переглядачів сьогодні вже не є проблемою: 97,5% у всьому світі, 98% у США та 99% у ЄС
  • Існує лайка підтримати його у скам’янілих браузерах (як IE8), якщо вам це справді потрібно
  • Перегляньте CanIUse для отримання додаткової інформації

89
Це ідоматичне JavaScript, просте та елегантне рішення саме те, що я шукав.
— Guilhem Soulas

9
Голосування за це, бо це дурно проста відповідь, яка працює на самоті.
— Трасіва

17
Напевно, досить високий% браузерів зараз це підтримує. На це слід звернути увагу значно більше.
— flq

2
Це чудова відповідь, і я маю це працювати з динамічним значенням валюти, тому якщо використання є в Європі, то воно змінюється на EUR та показує знак євро. Працює частування!
— Sprose

3
Це 2018 рік, і це в основному підтримується скрізь. Це має бути правильна відповідь.
— sarink

1340

Коротке та швидке рішення (працює скрізь!)

(12345.67).toFixed(2).replace(/\d(?=(\d{3})+\.)/g, '$&,');  // 12,345.67

Ідея цього рішення - замінити відповідні розділи першим матчем і комою, тобто '$&,'. Узгодження проводиться за допомогою підходу lookahead . Ви можете прочитати вираз як "відповідність номеру, якщо за ним послідовні послідовності з трьох наборів чисел (одна чи більше) та крапка" .

ТЕСТИ:

1        --> "1.00"
12       --> "12.00"
123      --> "123.00"
1234     --> "1,234.00"
12345    --> "12,345.00"
123456   --> "123,456.00"
1234567  --> "1,234,567.00"
12345.67 --> "12,345.67"

DEMO: http://jsfiddle.net/hAfMM/9571/


Розширене коротке рішення

Ви також можете розширити прототип Numberоб'єкта, щоб додати додаткову підтримку будь-якої кількості десяткових знаків [0 .. n]і розміру груп чисел [0 .. x]:

/**
 * Number.prototype.format(n, x)
 * 
 * @param integer n: length of decimal
 * @param integer x: length of sections
 */
Number.prototype.format = function(n, x) {
    var re = '\\d(?=(\\d{' + (x || 3) + '})+' + (n > 0 ? '\\.' : '$') + ')';
    return this.toFixed(Math.max(0, ~~n)).replace(new RegExp(re, 'g'), '$&,');
};

1234..format();           // "1,234"
12345..format(2);         // "12,345.00"
123456.7.format(3, 2);    // "12,34,56.700"
123456.789.format(2, 4);  // "12,3456.79"

ДЕМО / ТЕСТИ: http://jsfiddle.net/hAfMM/435/


Супер розширене коротке рішення

У цій супер розширеній версії ви можете встановити різні типи розмежувачів:

/**
 * Number.prototype.format(n, x, s, c)
 * 
 * @param integer n: length of decimal
 * @param integer x: length of whole part
 * @param mixed   s: sections delimiter
 * @param mixed   c: decimal delimiter
 */
Number.prototype.format = function(n, x, s, c) {
    var re = '\\d(?=(\\d{' + (x || 3) + '})+' + (n > 0 ? '\\D' : '$') + ')',
        num = this.toFixed(Math.max(0, ~~n));

    return (c ? num.replace('.', c) : num).replace(new RegExp(re, 'g'), '$&' + (s || ','));
};

12345678.9.format(2, 3, '.', ',');  // "12.345.678,90"
123456.789.format(4, 4, ' ', ':');  // "12 3456:7890"
12345678.9.format(0, 3, '-');       // "12-345-679"

ДЕМО / ТЕСТИ: http://jsfiddle.net/hAfMM/612/


21
Я на насправді пішов ще далі: .replace(/(\d)(?=(\d{3})+(?:\.\d+)?$)/g, "$1,").
— kalisjoshua

4
Версія CoffeeScript з регулярним виразом VisioN та kalisjoshua та способом визначення десяткових знаків (так що ви можете залишити за замовчуванням 2 або вказати 0 без десяткової точки):Number.prototype.toMoney = (decimal=2) -> @toFixed(decimal).replace /(\d)(?=(\d{3})+(?:\.\d+)?$)/g, "$1,"
— Ерік Андерсон

11
@Abbas Так, замініть \.на $(кінець рядка), тобто this.toFixed(0).replace(/(\d)(?=(\d{3})+$)/g, "$1,").
— VisioN

2
@hanumant Звичайна граматика тут трохи складна, тому я пропоную вам спочатку прочитати посібники щодо регулярних виразів (наприклад, на MDN ). Ідея, що стоїть за ним, - це заміна зібраних розділів першим матчем і комою, тобто $1,. Узгодження проводиться за допомогою підходу lookahead . Ви можете прочитати вираз як "відповідність номеру, якщо за ним послідовні послідовності з трьох наборів чисел (одна чи більше) та крапка" .
— VisioN

2
@ JuliendePrabère Наведіть приклад великого числа, яке не працює при такому підході.
— VisioN

248

Погляньте на об'єкт JavaScript з номером і подивіться, чи може він вам допомогти.

  • toLocaleString() буде відформатувати число за допомогою конкретного роздільника тисяч.
  • toFixed() округлятиме число до певної кількості знаків після коми.

Щоб одночасно їх використовувати, значення повинно змінити його тип на число, оскільки вони обидва виводять рядок.

Приклад:

Number((someNumber).toFixed(1)).toLocaleString()

2
Дякую! На основі цієї ідеї я зміг зробити таку, яка є короткою і простою! (і локалізовано) Відмінно.
— Даніель Маґіола

7
Насправді Ви можете. тобто для доларів: '$' + (значення + 0,001) .toLocaleString (). slice (0, -1)
— Zaptree

6
Схоже, це було б чудово, але наразі підтримка браузера мало
— acorncom

1
@acorncom Чому, як ви кажете, існує "маленька підтримка браузера"? Об'єкт "Число" існує вже з часів Javascript 1.1. Укажіть, будь ласка, довідку, яка підтверджує вашу претензію.
— Doug S

2
Слід подбати про те, що є стара версія, toLocaleStringяка використовує системний локал, і нова (несумісна), що надходить з API ECMAScript Intl. Пояснили тут . Ця відповідь, здається, призначена для старої версії.
— 1717

162

Нижче наведено код Патріка Дежардінса (псевдонім Даок), який додав трохи коментарів та деякі незначні зміни:

/* 
decimal_sep: character used as deciaml separtor, it defaults to '.' when omitted
thousands_sep: char used as thousands separator, it defaults to ',' when omitted
*/
Number.prototype.toMoney = function(decimals, decimal_sep, thousands_sep)
{ 
   var n = this,
   c = isNaN(decimals) ? 2 : Math.abs(decimals), //if decimal is zero we must take it, it means user does not want to show any decimal
   d = decimal_sep || '.', //if no decimal separator is passed we use the dot as default decimal separator (we MUST use a decimal separator)

   /*
   according to [/programming/411352/how-best-to-determine-if-an-argument-is-not-sent-to-the-javascript-function]
   the fastest way to check for not defined parameter is to use typeof value === 'undefined' 
   rather than doing value === undefined.
   */   
   t = (typeof thousands_sep === 'undefined') ? ',' : thousands_sep, //if you don't want to use a thousands separator you can pass empty string as thousands_sep value

   sign = (n < 0) ? '-' : '',

   //extracting the absolute value of the integer part of the number and converting to string
   i = parseInt(n = Math.abs(n).toFixed(c)) + '', 

   j = ((j = i.length) > 3) ? j % 3 : 0; 
   return sign + (j ? i.substr(0, j) + t : '') + i.substr(j).replace(/(\d{3})(?=\d)/g, "$1" + t) + (c ? d + Math.abs(n - i).toFixed(c).slice(2) : ''); 
}

і ось кілька тестів:

//some tests (do not forget parenthesis when using negative numbers and number with no decimals)
alert(123456789.67392.toMoney() + '\n' + 123456789.67392.toMoney(3) + '\n' + 123456789.67392.toMoney(0) + '\n' + (123456).toMoney() + '\n' + (123456).toMoney(0) + '\n' + 89.67392.toMoney() + '\n' + (89).toMoney());

//some tests (do not forget parenthesis when using negative numbers and number with no decimals)
alert((-123456789.67392).toMoney() + '\n' + (-123456789.67392).toMoney(-3));

Незначні зміни:

  1. трохи перенесли те, Math.abs(decimals)що потрібно зробити лише тоді, коли його немає NaN.

  2. decimal_sep більше не може бути порожнім рядком (певний десятковий роздільник - ОБОВ'ЯЗКОВО)

  3. ми використовуємо, typeof thousands_sep === 'undefined'як пропонується в розділі Як найкраще визначити, чи не надсилається аргумент функції JavaScript

  4. (+n || 0)не потрібен, оскільки thisє Numberоб’єктом

JS Fiddle


8
Можливо, ви хочете використовувати "10" як радіус для аналізу. В іншому випадку будь-яке число, яке починається з "0", використовуватиме восьмеричну нумерацію.
— sohtimsso1970

3
@ sohtimsso1970: вибачте за пізню відповідь, але ви могли б пояснити ще дещо? Я не бачу, де число можна інтерпретувати як восьмеричне. parseIntНазивають по абсолютній величині цілої частини числа. Частина INTEGER не може починатися з ZERO, якщо це не просто ZERO! І parseInt(0) === 0або вісімковий, або десятковий.
— Марко Демайо

спробуйте, наприклад: parseInt ("016") ... повертає 14, оскільки parseInt припускає, що його закодовано вісімкою, коли рядок починається з нуля.
— Tracker1

4
@ Tracker1: Я зрозумів, що число, що починається з 0, вважається восьмеричним parseInt. Але в цьому коді НЕМОЖЛИВО parseIntприймати 016як вхід (або будь-яке інше значення в форматі восьмери), оскільки аргумент, переданий в parseInt, обробляється 1-й Math.absфункцією. Таким чином, немає жодного способу parseIntотримати число, яке починається з нуля, якщо це просто нуль або 0.nn(де nnдесяткові числа). Але 0і 0.nnрядки, і рядки будуть перетворені parseIntна звичайне ZERO так, як передбачається.
— Марко Демайо

Ця функція невірна:> (2030) .toMoney (0, '.', ''); <"2 03 0"
— Антон П Робуль

124

Account.js - це крихітна бібліотека JavaScript для форматування кількості, грошей та валюти.


... просто не забудьте передати символ валюти, інакше вона помиляється в IE7 та IE8, IE9 добре в будь-якому випадку
— вектор

2
Схоже, виправлено помилку IE7 / IE8.
— Мат Шаффер

2
Це чудова бібліотека, можливість передачі символу валюти також є хорошою ідеєю, оскільки всі відомості про валюту містяться у виклику / налаштуваннях однієї функції
— farinspace

2
Мені подобається те, що ти можеш зробити зворотний - пропустити відформатований рядок валюти і отримати числове значення.
— Ніл Монро

2
Здається, останнім часом облік не підтримується. Один вил із останніми змінами - github.com/nashdot/accounting-js
— RationalDev любить GoFundMonica

124

Якщо сума - це число, скажімо -123, тоді

amount.toLocaleString('en-US', { style: 'currency', currency: 'USD' });

буде виробляти рядок "-$123.00".

Ось повний робочий приклад .


7
Ця відповідь була майже для мене, але мені потрібно було її округлити до найближчої копійки. Це те, що я використав iznos.toLocaleString ('en-GB', {стиль: 'валюта', валюта: 'GBP', максимальнийFractionDigits: 2});
— Ніко

Наведений вище код округлює кількість бажаних цифр. Дивіться приклад і введіть 1.237 у поле введення.
— Даніель Барбалас

3
Схоже, це не працює в Safari. Він просто повертає число у вигляді рядка без форматування.
— Ленс Андерсон

1
Ого, це справді чудова відповідь. Повинно бути зверху.
— Етан

2
Якщо ви з якоїсь причини не хочете копійок, ви можете змінити десяткову точність за допомогою:minimumFractionDigits: 0
— Horacio

99

Ось найкращий формат js грошей, який я бачив:

Number.prototype.formatMoney = function(decPlaces, thouSeparator, decSeparator) {
    var n = this,
        decPlaces = isNaN(decPlaces = Math.abs(decPlaces)) ? 2 : decPlaces,
        decSeparator = decSeparator == undefined ? "." : decSeparator,
        thouSeparator = thouSeparator == undefined ? "," : thouSeparator,
        sign = n < 0 ? "-" : "",
        i = parseInt(n = Math.abs(+n || 0).toFixed(decPlaces)) + "",
        j = (j = i.length) > 3 ? j % 3 : 0;
    return sign + (j ? i.substr(0, j) + thouSeparator : "") + i.substr(j).replace(/(\d{3})(?=\d)/g, "$1" + thouSeparator) + (decPlaces ? decSeparator + Math.abs(n - i).toFixed(decPlaces).slice(2) : "");
};

Він був переформатований і запозичений звідси: https://stackoverflow.com/a/149099/751484

Вам потрібно буде поставити власного позначення валюти (ви використовували $ вище).

Назвіть це так (хоча зауважте, що аргументи за замовчуванням становлять 2, кома та період, тому вам не потрібно вводити жодні аргументи, якщо це ваша перевага):

var myMoney=3543.75873;
var formattedMoney = '$' + myMoney.formatMoney(2,',','.'); // "$3,543.76"

стежте за глобальними знаком, i, j
— hacklikecrack

6
@hacklikecrack, всі змінні локальні; вони вvar заяві.
— Джонатан М

3
вибачте, так, хоча ви переосмислюєте аргументи. Відступ! ;)
— hacklikecrack

Жахливе використання змінних імен!
— Серж Саган

77

Тут вже є кілька чудових відповідей. Ось ще одна спроба, просто заради забави:

function formatDollar(num) {
    var p = num.toFixed(2).split(".");
    return "$" + p[0].split("").reverse().reduce(function(acc, num, i, orig) {
        return  num=="-" ? acc : num + (i && !(i % 3) ? "," : "") + acc;
    }, "") + "." + p[1];
}

І кілька тестів:

formatDollar(45664544.23423) // "$45,664,544.23"
formatDollar(45) // "$45.00"
formatDollar(123) // "$123.00"
formatDollar(7824) // "$7,824.00"
formatDollar(1) // "$1.00"

Відредаговано: тепер він також буде обробляти негативні числа


поезії. блискучий. ви спробували зменшити Right () developer.mozilla.org/en/JavaScript/Reference/Global_Objects/…, який повинен усунути зворотний ()?
— Стів

1
@Steve - Ви праві, але вам потрібно зробити щось на зразок i = orig.length - i - 1зворотного дзвінка. І все-таки одна менша обхід масиву.
— Уейн

11
Не про сумісність: reduceметод був введений в Ecmascript 1.8 і не підтримується в Internet Explorer 8 і нижче.
— Блейз

Як сказав @Blaise, цей метод не працюватиме в IE 8 або нижче.
— rsbarro

Так, це, звичайно, правильно. Як зазначається у самій відповіді, це просто для розваги. Крім того, він повинен добре поводитися з негативними цифрами.
— Уейн

76

Працює для всіх поточних браузерів

Використовуйте toLocaleStringдля форматування валюти в мовному уявленні (використовуючи коди валют ISO 4217 ).

(2500).toLocaleString("en-GB", {style: "currency", currency: "GBP", minimumFractionDigits: 2}) 

Приклад фрагментів коду південноафриканського ренду для @avenmore

console.log((2500).toLocaleString("en-ZA", {style: "currency", currency: "ZAR", minimumFractionDigits: 2}))
// -> R 2 500,00
console.log((2500).toLocaleString("en-GB", {style: "currency", currency: "ZAR", minimumFractionDigits: 2}))
// -> ZAR 2,500.00


1
Оскільки аргументи "locales" та "options" підтримуються лише дуже невеликою кількістю браузерів, таких як Chrome 24, IE11 та Opera 15. Firefox, Safari та старіші версії інших досі не підтримують це.
— VisioN

3
Погоджено, він не повністю підтримується у всіх браузерах (поки що), але все ж це рішення. (І, мабуть, найвірогідніше рішення, оскільки його форвард сумісний з браузерами, що не підтримуються, і це документально підтверджена особливість api Javascript.)
— Нік Грілі

1
Мені це подобається і я радий, що це працює з індійським групуванням цифр.
— MSC

7
Це повністю підтримується станом на 2017 рік і має бути єдиною правильною відповіддю
— Євгеній

1
Останні та найвищі :) FF69, Chrome76 та ін. "R 2 500,00" - це не те, що ми використовуємо тут, це повинно бути "R 2,500.00", як і en-GB.
— avenmore

70

Я думаю, що ти хочеш f.nettotal.value = "$" + showValue.toFixed(2);


@ розчавити це працює, але він більше не здійснює розрахунки на податковому полі?
— Rocco The Тако

11
Після того, як ви додасте до нього знак $, це вже не число, а рядок.
— розчавити

Цей параметр не ставить коми через тисячі. :-(
— Simon East


27

Гаразд, виходячи з того, що ви сказали, я використовую це:

var DecimalSeparator = Number("1.2").toLocaleString().substr(1,1);

var AmountWithCommas = Amount.toLocaleString();
var arParts = String(AmountWithCommas).split(DecimalSeparator);
var intPart = arParts[0];
var decPart = (arParts.length > 1 ? arParts[1] : '');
decPart = (decPart + '00').substr(0,2);

return '£ ' + intPart + DecimalSeparator + decPart;

Я відкритий для пропозицій щодо вдосконалення (я вважаю за краще не включати YUI просто для цього :-)) Я вже знаю, що мені слід виявити "." замість того, щоб просто використовувати його як десятковий роздільник ...


8
Зверніть увагу, що ваша версія не належить округлити до двох знаків після коми. Наприклад, 3.706 буде відформатовано як "3,70 фунтів стерлінгів", а не як "3,71 фунта", як належить.
— Атес Горал

Так, у моєму конкретному випадку це нормально, оскільки суми, з якими я працюю, мають максимум 2 цифри. Причина, яку мені потрібно встановити до 2 десяткових знаків, - це суми без десяткових знаків або лише 1.
— Даніель Маґіола

26

Я використовую бібліотеку Globalize (від Microsoft):

Це чудовий проект локалізації чисел, валют та дат та автоматичного форматування їх правильним способом відповідно до місцевості користувача! ... і незважаючи на це має бути розширення jQuery, на даний момент це 100% незалежна бібліотека. Пропоную всім спробувати! :)


3
Нічого собі, чому це не підтримується більше? Велика стандартизована бібліотека для всілякого форматування. Параметри форматування стандартної галузі з правильною глобалізацією. Чудова відповідь !!
— pbarranis

Це все ще вважається альфа-стадією, тому використовуйте обережно, але чудову знахідку.
— Ніл Монро

1
Більше не в альфа (або бета-версії). Це здається дуже корисним, поки ми чекаємо, коли Safari виконає новий стандарт і IE <11 помер.
— Гай Шалнат

25

javascript-формат-номер (раніше в Google Code )

  • Короткий, швидкий, гнучкий, але автономний. Лише 75 рядків, включаючи інформацію про ліцензію MIT, порожні рядки та коментарі.
  • Прийміть стандартне форматування чисел на кшталт #,##0.00або з запереченням-000.#### .
  • Прийміть будь-який формат країни , як # ##0,00, #,###.##,#'###.## або будь-який тип символу , НЕ нумерації.
  • Прийміть будь-які числа угруповання цифр. #,##,#0.000або#,###0.## всі вони дійсні.
  • Прийміть будь-яке зайве / нерозумне форматування. ##,###,##.#або0#,#00#.###0# все в порядку.
  • Автоматичне округлення номера.
  • Простий інтерфейс, просто маска та значення, як це: format( "0.0000", 3.141592) .
  • Додайте до маски префікс і суфікс

(уривок з його README)


23

+1 Джонатану М за надання оригінального методу. Оскільки це явно формат валюти, я пішов вперед і додав до виводу символ валюти (за замовчуванням "$") і додав коду за замовчуванням як роздільник тисяч. Якщо ви насправді не хочете символу валюти (або роздільника тисяч), просто використовуйте "" (порожній рядок) як аргумент для цього.

Number.prototype.formatMoney = function(decPlaces, thouSeparator, decSeparator, currencySymbol) {
    // check the args and supply defaults:
    decPlaces = isNaN(decPlaces = Math.abs(decPlaces)) ? 2 : decPlaces;
    decSeparator = decSeparator == undefined ? "." : decSeparator;
    thouSeparator = thouSeparator == undefined ? "," : thouSeparator;
    currencySymbol = currencySymbol == undefined ? "$" : currencySymbol;

    var n = this,
        sign = n < 0 ? "-" : "",
        i = parseInt(n = Math.abs(+n || 0).toFixed(decPlaces)) + "",
        j = (j = i.length) > 3 ? j % 3 : 0;

    return sign + currencySymbol + (j ? i.substr(0, j) + thouSeparator : "") + i.substr(j).replace(/(\d{3})(?=\d)/g, "$1" + thouSeparator) + (decPlaces ? decSeparator + Math.abs(n - i).toFixed(decPlaces).slice(2) : "");
};

Перший var начебто дивний, оскільки ці змінні вже оголошені в декларації функції. Крім цього, дякую!
— Річ Бредшоу

2
Ти правий. Це помилка, яку я вніс із оригіналу Джонатана М, де всі вони приковані як єдиний вираз вару. Це повинні бути прості завдання. Закріплення.
— XML

З цього приводу я думаю, що це, мабуть, передчасно оптимізовано, і його слід переробити для зручності читання. Але моя мета полягала в тому, щоб розширити код ОП, а не кардинально його змінити.
— XML

Це не надто погано - +n || 0єдине, що здається трохи дивним (для мене все одно).
— Rich Bradshaw

2
this- ідеально корисна назва змінної. Перетворити його nтак, щоб ви могли зберегти 3 символи на час визначення, можливо, це було б потрібно в епоху, коли оперативна пам’ять та пропускну здатність рахувалися в КБ, але це просто обов язково в епоху, коли мініфікатор подбає про все, що до того, як коли-небудь потрапить у виробництво. Інші розумні мікрооптимізації принаймні дискусійні.
— XML

22

Існує порт javascript функції PHP "number_format".

Я вважаю це дуже корисним, оскільки він простий у використанні та впізнаваний для розробників PHP.

function number_format (number, decimals, dec_point, thousands_sep) {
    var n = number, prec = decimals;

    var toFixedFix = function (n,prec) {
        var k = Math.pow(10,prec);
        return (Math.round(n*k)/k).toString();
    };

    n = !isFinite(+n) ? 0 : +n;
    prec = !isFinite(+prec) ? 0 : Math.abs(prec);
    var sep = (typeof thousands_sep === 'undefined') ? ',' : thousands_sep;
    var dec = (typeof dec_point === 'undefined') ? '.' : dec_point;

    var s = (prec > 0) ? toFixedFix(n, prec) : toFixedFix(Math.round(n), prec); 
    //fix for IE parseFloat(0.55).toFixed(0) = 0;

    var abs = toFixedFix(Math.abs(n), prec);
    var _, i;

    if (abs >= 1000) {
        _ = abs.split(/\D/);
        i = _[0].length % 3 || 3;

        _[0] = s.slice(0,i + (n < 0)) +
               _[0].slice(i).replace(/(\d{3})/g, sep+'$1');
        s = _.join(dec);
    } else {
        s = s.replace('.', dec);
    }

    var decPos = s.indexOf(dec);
    if (prec >= 1 && decPos !== -1 && (s.length-decPos-1) < prec) {
        s += new Array(prec-(s.length-decPos-1)).join(0)+'0';
    }
    else if (prec >= 1 && decPos === -1) {
        s += dec+new Array(prec).join(0)+'0';
    }
    return s; 
}

(Блок коментарів з оригіналу , наведений нижче для прикладів та кредитів, де належний)

// Formats a number with grouped thousands
//
// version: 906.1806
// discuss at: http://phpjs.org/functions/number_format
// +   original by: Jonas Raoni Soares Silva (http://www.jsfromhell.com)
// +   improved by: Kevin van Zonneveld (http://kevin.vanzonneveld.net)
// +     bugfix by: Michael White (http://getsprink.com)
// +     bugfix by: Benjamin Lupton
// +     bugfix by: Allan Jensen (http://www.winternet.no)
// +    revised by: Jonas Raoni Soares Silva (http://www.jsfromhell.com)
// +     bugfix by: Howard Yeend
// +    revised by: Luke Smith (http://lucassmith.name)
// +     bugfix by: Diogo Resende
// +     bugfix by: Rival
// +     input by: Kheang Hok Chin (http://www.distantia.ca/)
// +     improved by: davook
// +     improved by: Brett Zamir (http://brett-zamir.me)
// +     input by: Jay Klehr
// +     improved by: Brett Zamir (http://brett-zamir.me)
// +     input by: Amir Habibi (http://www.residence-mixte.com/)
// +     bugfix by: Brett Zamir (http://brett-zamir.me)
// *     example 1: number_format(1234.56);
// *     returns 1: '1,235'
// *     example 2: number_format(1234.56, 2, ',', ' ');
// *     returns 2: '1 234,56'
// *     example 3: number_format(1234.5678, 2, '.', '');
// *     returns 3: '1234.57'
// *     example 4: number_format(67, 2, ',', '.');
// *     returns 4: '67,00'
// *     example 5: number_format(1000);
// *     returns 5: '1,000'
// *     example 6: number_format(67.311, 2);
// *     returns 6: '67.31'
// *     example 7: number_format(1000.55, 1);
// *     returns 7: '1,000.6'
// *     example 8: number_format(67000, 5, ',', '.');
// *     returns 8: '67.000,00000'
// *     example 9: number_format(0.9, 0);
// *     returns 9: '1'
// *     example 10: number_format('1.20', 2);
// *     returns 10: '1.20'
// *     example 11: number_format('1.20', 4);
// *     returns 11: '1.2000'
// *     example 12: number_format('1.2000', 3);
// *     returns 12: '1.200'

Це лише одна правильна функція:> number_format (2030, 0, '.', '') <'2 030' Чудово! Спасибі
— Антон Р Робуль

21

Коротший спосіб (для вставки пробілу, коми або точки) з регулярним виразом?

    Number.prototype.toCurrencyString=function(){
        return this.toFixed(2).replace(/(\d)(?=(\d{3})+\b)/g,'$1 ');
    }

    n=12345678.9;
    alert(n.toCurrencyString());

20

Нічого подібного не бачив. Це досить стисло і легко зрозуміти.

function moneyFormat(price, sign = '$') {
  const pieces = parseFloat(price).toFixed(2).split('')
  let ii = pieces.length - 3
  while ((ii-=3) > 0) {
    pieces.splice(ii, 0, ',')
  }
  return sign + pieces.join('')
}

console.log(
  moneyFormat(100),
  moneyFormat(1000),
  moneyFormat(10000.00),
  moneyFormat(1000000000000000000)
)

Ось версія з більшою кількістю опцій у кінцевому висновку, що дозволяє форматувати різні валюти в різних форматах локальності.

// higher order function that takes options then a price and will return the formatted price
const makeMoneyFormatter = ({
  sign = '$',
  delimiter = ',',
  decimal = '.',
  append = false,
  precision = 2,
  round = true,
  custom
} = {}) => value => {
  
  const e = [1, 10, 100, 1000, 10000, 100000, 1000000, 10000000]
  
  value = round
    ? (Math.round(value * e[precision]) / e[precision])
    : parseFloat(value)
  
  const pieces = value
    .toFixed(precision)
    .replace('.', decimal)
    .split('')
  
  let ii = pieces.length - (precision ? precision + 1 : 0)
  
  while ((ii-=3) > 0) {
    pieces.splice(ii, 0, delimiter)
  }
  
  if (typeof custom === 'function') {
    return custom({
      sign,
      float: value, 
      value: pieces.join('') 
    })
  }
  
  return append
    ? pieces.join('') + sign
    : sign + pieces.join('')
}

// create currency converters with the correct formatting options
const formatDollar = makeMoneyFormatter()
const formatPound = makeMoneyFormatter({ 
  sign: '£',
  precision: 0
})
const formatEuro = makeMoneyFormatter({
  sign: '€',
  delimiter: '.',
  decimal: ',',
  append: true
})

const customFormat = makeMoneyFormatter({
  round: false,
  custom: ({ value, float, sign }) => `SALE:$${value}USD`
})

console.log(
  formatPound(1000),
  formatDollar(10000.0066),
  formatEuro(100000.001),
  customFormat(999999.555)
)


Чудовий фрагмент коду, дякую. Однак будьте обережні, оскільки він не працюватиме в IE, оскільки параметри за замовчуванням не підтримуються, а "const" і "let" не підтримуються в <IE11. Ue це для виправлення: + moneyFormat: функція (ціна, знак) {+ if (! Знак) знак = '$'; + шматки = розбірFloat (ціна) .toFixed (2) .split ('') + var ii = piece.length - 3
— Charlie Dalsass

Не хвилюйтесь @CharlieDalsass. Я рекомендую використовувати babel, щоб компілювати його до ES5 для виробничого коду.
— synthet1c

Але як зробити євро валюту? 1.000,00 євро?

@YumYumYum Я додав повний приклад з більшою кількістю опцій форматування, щоб забезпечити більшу гнучкість.
— synthet1c

18

Відповідь Патріка Дежардінса виглядає добре, але я віддаю перевагу простому JavaScript. Ось функція, яку я щойно написав, щоб взяти номер і повернути його у форматі валюти (мінус знак долара)

// Format numbers to two decimals with commas
function formatDollar(num) {
    var p = num.toFixed(2).split(".");
    var chars = p[0].split("").reverse();
    var newstr = '';
    var count = 0;
    for (x in chars) {
        count++;
        if(count%3 == 1 && count != 1) {
            newstr = chars[x] + ',' + newstr;
        } else {
            newstr = chars[x] + newstr;
        }
    }
    return newstr + "." + p[1];
}

Мені потрібно було щось працювати як у браузері, так і в старій версії Node. Це спрацювало чудово. Дякую
— n8jadams

17

Основна частина - це вставлення тисяч роздільників, які можна зробити так:

<script type="text/javascript">
function ins1000Sep(val){
  val = val.split(".");
  val[0] = val[0].split("").reverse().join("");
  val[0] = val[0].replace(/(\d{3})/g,"$1,");
  val[0] = val[0].split("").reverse().join("");
  val[0] = val[0].indexOf(",")==0?val[0].substring(1):val[0];
  return val.join(".");
}
function rem1000Sep(val){
  return val.replace(/,/g,"");
}
function formatNum(val){
  val = Math.round(val*100)/100;
  val = (""+val).indexOf(".")>-1 ? val + "00" : val + ".00";
  var dec = val.indexOf(".");
  return dec == val.length-3 || dec == 0 ? val : val.substring(0,dec+3);
}
</script>

<button onclick="alert(ins1000Sep(formatNum(12313231)));">

Я отримую неправильний вихідний номер під час введення негативних значень в ins1000Sep ().
— Петро

16

Є вбудований function toFixed вjavascript

var num = new Number(349);
document.write("$" + num.toFixed(2));

Ця відповідь виглядає зайвою. Відповідь Круша вже наголошенаtoFixed()
— Іен Данн,

3
toFixed()є функцією Numberоб'єкта і не буде працювати над тим, var numякби це було String, тому додатковий контекст мені допоміг.
— timborden

15
function CurrencyFormatted(amount)
{
    var i = parseFloat(amount);
    if(isNaN(i)) { i = 0.00; }
    var minus = '';
    if(i < 0) { minus = '-'; }
    i = Math.abs(i);
    i = parseInt((i + .005) * 100);
    i = i / 100;
    s = new String(i);
    if(s.indexOf('.') < 0) { s += '.00'; }
    if(s.indexOf('.') == (s.length - 2)) { s += '0'; }
    s = minus + s;
    return s;
}

Від WillMaster .


Невеликий і простий. Дякую.
— Коннор Сімпсон

1
проста, але без коми на 1000
— арон

15

Я пропоную клас NumberFormat від API візуалізації Google .

Ви можете зробити щось подібне:

var formatter = new google.visualization.NumberFormat({
    prefix: '$',
    pattern: '#,###,###.##'
});

formatter.formatValue(1000000); // $ 1,000,000

Я сподіваюся, що це допомагає.


14

Це може бути трохи пізно, але ось метод, який я щойно розробив для колеги, щоб додати .toCurrencyString()функцію, що знає локаль, до всіх чисел. Інтерналізація призначена лише для групування чисел, а не знаку валюти - якщо ви випускаєте долари, використовуйте "$"поставлені, бо $123 4567в Японії чи Китаї стільки ж доларів, скільки $1,234,567тут у США. Якщо ви продаєте євро / тощо., То змініть знак валюти на"$" .

Декларуйте це де завгодно у вашій ГЛАВІ чи де завгодно, безпосередньо перед тим, як використовувати його:

  Number.prototype.toCurrencyString = function(prefix, suffix) {
    if (typeof prefix === 'undefined') { prefix = '$'; }
    if (typeof suffix === 'undefined') { suffix = ''; }
    var _localeBug = new RegExp((1).toLocaleString().replace(/^1/, '').replace(/\./, '\\.') + "$");
    return prefix + (~~this).toLocaleString().replace(_localeBug, '') + (this % 1).toFixed(2).toLocaleString().replace(/^[+-]?0+/,'') + suffix;
  }

Тоді ви закінчили! Використовуйте (number).toCurrencyString()де завгодно, щоб виводити номер як валюту.

var MyNumber = 123456789.125;
alert(MyNumber.toCurrencyString()); // alerts "$123,456,789.13"
MyNumber = -123.567;
alert(MyNumber.toCurrencyString()); // alerts "$-123.57"

12

Як завжди, існує кілька способів зробити те саме, але я б уникав цього використовувати Number.prototype.toLocaleString оскільки він може повертати різні значення залежно від налаштувань користувача.

Я також не рекомендую розширювати Number.prototypeпрототипи власних об'єктів - це погана практика, оскільки це може спричинити конфлікти з кодом інших людей (наприклад, бібліотеками / рамками / плагінами) і може бути не сумісно з майбутніми реалізаціями / версіями JavaScript.

Я вважаю, що регулярні вирази - найкращий підхід до проблеми, ось моя реалізація:

/**
 * Converts number into currency format
 * @param {number} number   Number that should be converted.
 * @param {string} [decimalSeparator]    Decimal separator, defaults to '.'.
 * @param {string} [thousandsSeparator]    Thousands separator, defaults to ','.
 * @param {int} [nDecimalDigits]    Number of decimal digits, defaults to `2`.
 * @return {string} Formatted string (e.g. numberToCurrency(12345.67) returns '12,345.67')
 */
function numberToCurrency(number, decimalSeparator, thousandsSeparator, nDecimalDigits){
    //default values
    decimalSeparator = decimalSeparator || '.';
    thousandsSeparator = thousandsSeparator || ',';
    nDecimalDigits = nDecimalDigits == null? 2 : nDecimalDigits;

    var fixed = number.toFixed(nDecimalDigits), //limit/add decimal digits
        parts = new RegExp('^(-?\\d{1,3})((?:\\d{3})+)(\\.(\\d{'+ nDecimalDigits +'}))?$').exec( fixed ); //separate begin [$1], middle [$2] and decimal digits [$4]

    if(parts){ //number >= 1000 || number <= -1000
        return parts[1] + parts[2].replace(/\d{3}/g, thousandsSeparator + '$&') + (parts[4] ? decimalSeparator + parts[4] : '');
    }else{
        return fixed.replace('.', decimalSeparator);
    }
}

відредаговано 30.08.2010: додано опцію встановлення кількості десяткових цифр. відредаговано 23.08.2011: додана опція для встановлення числа десяткових цифр до нуля.


Сенс toLocaleString полягає в тому, що він коригується з налаштуваннями користувача.
— Джозеф Леннокс

11

Ось декілька рішень, усі пройдіть тестовий набір, тестовий набір та орієнтир, включені, якщо ви хочете скопіювати та вставити тест, спробуйте цей Gist .

Спосіб 0 (RegExp)

Базуйтесь на https://stackoverflow.com/a/14428340/1877620 , але виправте, якщо немає десяткової коми.

if (typeof Number.prototype.format === 'undefined') {
    Number.prototype.format = function (precision) {
        if (!isFinite(this)) {
            return this.toString();
        }

        var a = this.toFixed(precision).split('.');
        a[0] = a[0].replace(/\d(?=(\d{3})+$)/g, '$&,');
        return a.join('.');
    }
}

Спосіб 1

if (typeof Number.prototype.format === 'undefined') {
    Number.prototype.format = function (precision) {
        if (!isFinite(this)) {
            return this.toString();
        }

        var a = this.toFixed(precision).split('.'),
            // skip the '-' sign
            head = Number(this < 0);

        // skip the digits that's before the first thousands separator 
        head += (a[0].length - head) % 3 || 3;

        a[0] = a[0].slice(0, head) + a[0].slice(head).replace(/\d{3}/g, ',$&');
        return a.join('.');
    };
}

Спосіб 2 (Спліт на масив)

if (typeof Number.prototype.format === 'undefined') {
    Number.prototype.format = function (precision) {
        if (!isFinite(this)) {
            return this.toString();
        }

        var a = this.toFixed(precision).split('.');

        a[0] = a[0]
            .split('').reverse().join('')
            .replace(/\d{3}(?=\d)/g, '$&,')
            .split('').reverse().join('');

        return a.join('.');
    };
}

Спосіб 3 (цикл)

if (typeof Number.prototype.format === 'undefined') {
    Number.prototype.format = function (precision) {
        if (!isFinite(this)) {
            return this.toString();
        }

        var a = this.toFixed(precision).split('');
        a.push('.');

        var i = a.indexOf('.') - 3;
        while (i > 0 && a[i-1] !== '-') {
            a.splice(i, 0, ',');
            i -= 3;
        }

        a.pop();
        return a.join('');
    };
}

Приклад використання

console.log('======== Demo ========')
console.log(
    (1234567).format(0),
    (1234.56).format(2),
    (-1234.56).format(0)
);
var n = 0;
for (var i=1; i<20; i++) {
    n = (n * 10) + (i % 10)/100;
    console.log(n.format(2), (-n).format(2));
}

Роздільник

Якщо ми хочемо спеціальний роздільник тисяч або десятковий роздільник, використовуємо replace():

123456.78.format(2).replace(',', ' ').replace('.', ' ');

Тестовий набір

function assertEqual(a, b) {
    if (a !== b) {
        throw a + ' !== ' + b;
    }
}

function test(format_function) {
    console.log(format_function);
    assertEqual('NaN', format_function.call(NaN, 0))
    assertEqual('Infinity', format_function.call(Infinity, 0))
    assertEqual('-Infinity', format_function.call(-Infinity, 0))

    assertEqual('0', format_function.call(0, 0))
    assertEqual('0.00', format_function.call(0, 2))
    assertEqual('1', format_function.call(1, 0))
    assertEqual('-1', format_function.call(-1, 0))
    // decimal padding
    assertEqual('1.00', format_function.call(1, 2))
    assertEqual('-1.00', format_function.call(-1, 2))
    // decimal rounding
    assertEqual('0.12', format_function.call(0.123456, 2))
    assertEqual('0.1235', format_function.call(0.123456, 4))
    assertEqual('-0.12', format_function.call(-0.123456, 2))
    assertEqual('-0.1235', format_function.call(-0.123456, 4))
    // thousands separator
    assertEqual('1,234', format_function.call(1234.123456, 0))
    assertEqual('12,345', format_function.call(12345.123456, 0))
    assertEqual('123,456', format_function.call(123456.123456, 0))
    assertEqual('1,234,567', format_function.call(1234567.123456, 0))
    assertEqual('12,345,678', format_function.call(12345678.123456, 0))
    assertEqual('123,456,789', format_function.call(123456789.123456, 0))
    assertEqual('-1,234', format_function.call(-1234.123456, 0))
    assertEqual('-12,345', format_function.call(-12345.123456, 0))
    assertEqual('-123,456', format_function.call(-123456.123456, 0))
    assertEqual('-1,234,567', format_function.call(-1234567.123456, 0))
    assertEqual('-12,345,678', format_function.call(-12345678.123456, 0))
    assertEqual('-123,456,789', format_function.call(-123456789.123456, 0))
    // thousands separator and decimal
    assertEqual('1,234.12', format_function.call(1234.123456, 2))
    assertEqual('12,345.12', format_function.call(12345.123456, 2))
    assertEqual('123,456.12', format_function.call(123456.123456, 2))
    assertEqual('1,234,567.12', format_function.call(1234567.123456, 2))
    assertEqual('12,345,678.12', format_function.call(12345678.123456, 2))
    assertEqual('123,456,789.12', format_function.call(123456789.123456, 2))
    assertEqual('-1,234.12', format_function.call(-1234.123456, 2))
    assertEqual('-12,345.12', format_function.call(-12345.123456, 2))
    assertEqual('-123,456.12', format_function.call(-123456.123456, 2))
    assertEqual('-1,234,567.12', format_function.call(-1234567.123456, 2))
    assertEqual('-12,345,678.12', format_function.call(-12345678.123456, 2))
    assertEqual('-123,456,789.12', format_function.call(-123456789.123456, 2))
}

console.log('======== Testing ========');
test(Number.prototype.format);
test(Number.prototype.format1);
test(Number.prototype.format2);
test(Number.prototype.format3);

Орієнтир

function benchmark(f) {
    var start = new Date().getTime();
    f();
    return new Date().getTime() - start;
}

function benchmark_format(f) {
    console.log(f);
    time = benchmark(function () {
        for (var i = 0; i < 100000; i++) {
            f.call(123456789, 0);
            f.call(123456789, 2);
        }
    });
    console.log(time.format(0) + 'ms');
}

// if not using async, browser will stop responding while running.
// this will create a new thread to benchmark
async = [];
function next() {
    setTimeout(function () {
        f = async.shift();
        f && f();
        next();
    }, 10);
}

console.log('======== Benchmark ========');
async.push(function () { benchmark_format(Number.prototype.format); });
next();

Удосконалено з вашого методу 2. змінити з var a = this.toFixed (точність) .split ('.'), На множник var = Math.pow (10, точність + 1), wholeNumber = Math.floor (це * множник) ; var a = Math.round (fullNumber / 10) * 10 / множник; if (String (a) .indexOf ('.') <1) {a + = '.00'; } a = String (a) .split ('.'), не використовуйте toFixed, оскільки він баггі.
— vee

console.log (parseFloat ('4.835'). toFixed (2)); > 4,83 console.log (parseFloat ('54 .835 '). ToFixed (2)); > 54,84 console.log (parseFloat ('454.835'). ToFixed (2)); > 454,83 console.log (parseFloat ('8454.835'). ToFixed (2)); > 8454.83 всі десятки цих значень повинні бути .84 не .83
— ві


10

Простий варіант правильного розміщення кома шляхом перевороту першого рядка та основного регулярного вираження.

String.prototype.reverse = function() {
    return this.split('').reverse().join('');
};

Number.prototype.toCurrency = function( round_decimal /*boolean*/ ) {       
     // format decimal or round to nearest integer
     var n = this.toFixed( round_decimal ? 0 : 2 );

     // convert to a string, add commas every 3 digits from left to right 
     // by reversing string
     return (n + '').reverse().replace( /(\d{3})(?=\d)/g, '$1,' ).reverse();
};

10

Я знайшов це у: Account.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

// Euro currency symbol to the right
accounting.formatMoney(5318008, {symbol: "€", precision: 2, thousand: ".", decimal : ",", format: "%v%s"}); // 1.008,00€ 


$('#price').val( accounting.formatMoney(OOA, { symbol: "€", precision: 2,thousand: ".", decimal :",",format: "%v%s" } ) );- шоу 1.000,00 E
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.