Я хотів би відформатувати ціну в JavaScript. Я хотів би функцію, яка бере float
аргумент і повертає такий string
формат:
"$ 2,500.00"
Який найкращий спосіб зробити це?
Я хотів би відформатувати ціну в JavaScript. Я хотів би функцію, яка бере float
аргумент і повертає такий string
формат:
"$ 2,500.00"
Який найкращий спосіб зробити це?
Відповіді:
Це рішення сумісне з кожним головним браузером:
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,
Якщо ви можете використовувати сучасний синтаксис 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>
d
та t
бути, .
і ,
відповідно, щоб не потрібно їх вказувати кожен раз. Також я рекомендую змінити початок return
виписки, щоб прочитати: return s + '$' + [rest]
інакше ви не отримаєте знак долара.
У Javascript є формат чисел (частина інтернаціоналізації API).
// Create our number formatter.
var formatter = new Intl.NumberFormat('en-US', {
style: 'currency',
currency: 'USD',
});
formatter.format(2500); /* $2,500.00 */
Використовуйте undefined
замість першого аргументу ( 'en-US'
у прикладі) для використання системного локалу (місце користувача, якщо код працює у браузері). Подальше пояснення коду локалі .
Ось список кодів валюти .
Заключна примітка, порівнюючи це зі старшими. toLocaleString
. Вони обидва пропонують однакову функціональність. Однак toLocaleString у своїх старих втіленнях (pre-Intl) насправді не підтримує локалі : він використовує системний локал. Тому переконайтеся, що ви використовуєте правильну версію ( MDN пропонує перевірити наявністьIntl
). Також продуктивність обох є однаковою для одного елемента, але якщо у вас є багато цифр для форматування, використання Intl.NumberFormat
~ в 70 разів швидше. Ось як користуватися toLocaleString
:
(2500).toLocaleString('en-US', {
style: 'currency',
currency: 'USD',
}); /* $2,500.00 */
(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/
.replace(/(\d)(?=(\d{3})+(?:\.\d+)?$)/g, "$1,")
.
Number.prototype.toMoney = (decimal=2) -> @toFixed(decimal).replace /(\d)(?=(\d{3})+(?:\.\d+)?$)/g, "$1,"
\.
на $
(кінець рядка), тобто this.toFixed(0).replace(/(\d)(?=(\d{3})+$)/g, "$1,")
.
$1,
. Узгодження проводиться за допомогою підходу lookahead . Ви можете прочитати вираз як "відповідність номеру, якщо за ним послідовні послідовності з трьох наборів чисел (одна чи більше) та крапка" .
Погляньте на об'єкт JavaScript з номером і подивіться, чи може він вам допомогти.
toLocaleString()
буде відформатувати число за допомогою конкретного роздільника тисяч. toFixed()
округлятиме число до певної кількості знаків після коми.Щоб одночасно їх використовувати, значення повинно змінити його тип на число, оскільки вони обидва виводять рядок.
Приклад:
Number((someNumber).toFixed(1)).toLocaleString()
toLocaleString
яка використовує системний локал, і нова (несумісна), що надходить з API ECMAScript Intl. Пояснили тут . Ця відповідь, здається, призначена для старої версії.
Нижче наведено код Патріка Дежардінса (псевдонім Даок), який додав трохи коментарів та деякі незначні зміни:
/*
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));
Незначні зміни:
трохи перенесли те, Math.abs(decimals)
що потрібно зробити лише тоді, коли його немає NaN
.
decimal_sep
більше не може бути порожнім рядком (певний десятковий роздільник - ОБОВ'ЯЗКОВО)
ми використовуємо, typeof thousands_sep === 'undefined'
як пропонується в розділі Як найкраще визначити, чи не надсилається аргумент функції JavaScript
(+n || 0)
не потрібен, оскільки this
є Number
об’єктом
parseInt
Називають по абсолютній величині цілої частини числа. Частина INTEGER не може починатися з ZERO, якщо це не просто ZERO! І parseInt(0) === 0
або вісімковий, або десятковий.
0
, вважається восьмеричним parseInt
. Але в цьому коді НЕМОЖЛИВО parseInt
приймати 016
як вхід (або будь-яке інше значення в форматі восьмери), оскільки аргумент, переданий в parseInt
, обробляється 1-й Math.abs
функцією. Таким чином, немає жодного способу parseInt
отримати число, яке починається з нуля, якщо це просто нуль або 0.nn
(де nn
десяткові числа). Але 0
і 0.nn
рядки, і рядки будуть перетворені parseInt
на звичайне ZERO так, як передбачається.
Account.js - це крихітна бібліотека JavaScript для форматування кількості, грошей та валюти.
Якщо сума - це число, скажімо -123
, тоді
amount.toLocaleString('en-US', { style: 'currency', currency: 'USD' });
буде виробляти рядок "-$123.00"
.
Ось повний робочий приклад .
minimumFractionDigits: 0
Ось найкращий формат 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"
var
заяві.
Тут вже є кілька чудових відповідей. Ось ще одна спроба, просто заради забави:
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"
Відредаговано: тепер він також буде обробляти негативні числа
i = orig.length - i - 1
зворотного дзвінка. І все-таки одна менша обхід масиву.
reduce
метод був введений в Ecmascript 1.8 і не підтримується в Internet Explorer 8 і нижче.
Працює для всіх поточних браузерів
Використовуйте 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
Я думаю, що ти хочеш f.nettotal.value = "$" + showValue.toFixed(2);
Numeral.js - бібліотека js для зручного форматування чисел від @adamwdraper
numeral(23456.789).format('$0,0.00'); // = "$23,456.79"
Гаразд, виходячи з того, що ви сказали, я використовую це:
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 просто для цього :-)) Я вже знаю, що мені слід виявити "." замість того, щоб просто використовувати його як десятковий роздільник ...
Я використовую бібліотеку Globalize (від Microsoft):
Це чудовий проект локалізації чисел, валют та дат та автоматичного форматування їх правильним способом відповідно до місцевості користувача! ... і незважаючи на це має бути розширення jQuery, на даний момент це 100% незалежна бібліотека. Пропоную всім спробувати! :)
javascript-формат-номер (раніше в Google Code )
#,##0.00
або з запереченням-000.####
.# ##0,00
, #,###.##
,#'###.##
або будь-який тип символу , НЕ нумерації.#,##,#0.000
або#,###0.##
всі вони дійсні.##,###,##.#
або0#,#00#.###0#
все в порядку.format( "0.0000", 3.141592)
.(уривок з його README)
+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) : "");
};
+n || 0
єдине, що здається трохи дивним (для мене все одно).
this
- ідеально корисна назва змінної. Перетворити його n
так, щоб ви могли зберегти 3 символи на час визначення, можливо, це було б потрібно в епоху, коли оперативна пам’ять та пропускну здатність рахувалися в КБ, але це просто обов язково в епоху, коли мініфікатор подбає про все, що до того, як коли-небудь потрапить у виробництво. Інші розумні мікрооптимізації принаймні дискусійні.
Існує порт 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.prototype.toCurrencyString=function(){
return this.toFixed(2).replace(/(\d)(?=(\d{3})+\b)/g,'$1 ');
}
n=12345678.9;
alert(n.toCurrencyString());
Нічого подібного не бачив. Це досить стисло і легко зрозуміти.
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)
)
Відповідь Патріка Дежардінса виглядає добре, але я віддаю перевагу простому 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];
}
Основна частина - це вставлення тисяч роздільників, які можна зробити так:
<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)));">
Є вбудований function
toFixed вjavascript
var num = new Number(349);
document.write("$" + num.toFixed(2));
toFixed()
toFixed()
є функцією Number
об'єкта і не буде працювати над тим, var num
якби це було String
, тому додатковий контекст мені допоміг.
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 .
Я пропоную клас NumberFormat від API візуалізації Google .
Ви можете зробити щось подібне:
var formatter = new google.visualization.NumberFormat({
prefix: '$',
pattern: '#,###,###.##'
});
formatter.formatValue(1000000); // $ 1,000,000
Я сподіваюся, що це допомагає.
Це може бути трохи пізно, але ось метод, який я щойно розробив для колеги, щоб додати .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"
Як завжди, існує кілька способів зробити те саме, але я б уникав цього використовувати 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: додана опція для встановлення числа десяткових цифр до нуля.
Ось декілька рішень, усі пройдіть тестовий набір, тестовий набір та орієнтир, включені, якщо ви хочете скопіювати та вставити тест, спробуйте цей Gist .
Базуйтесь на 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('.');
}
}
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('.');
};
}
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('.');
};
}
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();
Number(value)
.toFixed(2)
.replace(/(\d)(?=(\d{3})+(?!\d))/g, "$1,")
Простий варіант правильного розміщення кома шляхом перевороту першого рядка та основного регулярного вираження.
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();
};
Я знайшов це у: 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€
formatNumber
в JavaScript