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


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.