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,
커스텀 기능 (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>
답변
국제 숫자 형식
Javascript에는 숫자 포맷터 (Internationalization 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'
예 🙂 대신 사용하십시오 . 로케일 코드에 대한 추가 설명 .
통화 코드 목록은 다음과 같습니다 .
Intl.NumberFormat과 Number.prototype.toLocaleString
이것을 이전과 비교하는 마지막 메모. toLocaleString
. 둘 다 본질적으로 동일한 기능을 제공합니다. 그러나 이전 화신 (pre-Intl)의 toLocaleString은 실제로 로케일을 지원하지 않습니다 . 시스템 로케일을 사용합니다. 따라서 올바른 버전을 사용하고 있는지 확인하십시오 ( 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 접근법을 사용하여 수행됩니다 . “3 개의 숫자 세트 (하나 이상)의 시퀀스와 점으로 구성된 숫자와 일치하는 경우”와 같이 표현식을 읽을 수 있습니다 .
테스트 :
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"
데모 : 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/
답변
JavaScript Number 객체를 살펴보고 도움이 될 수 있는지 확인하십시오.
toLocaleString()
위치 별 천 단위 구분 기호를 사용하여 숫자를 형식화합니다.toFixed()
숫자를 특정 소수점 이하 자릿수로 반올림합니다.
이들을 동시에 사용하려면 값이 모두 문자열로 출력되므로 유형이 숫자로 다시 변경되어야합니다.
예:
Number((someNumber).toFixed(1)).toLocaleString()
답변
아래는 Patrick Desjardins (별칭 Daok) 코드이며 약간의 주석이 추가되고 약간의 변경 사항이 있습니다.
/*
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
더 이상 빈 문자열이 될 수 없습니다 (소수 구분 기호는 필수입니다) -
우리 는 인수가 JavaScript 함수로 전송되지 않는지를 결정하는 가장 좋은 방법에
typeof thousands_sep === 'undefined'
제안 된대로 사용 합니다. -
(+n || 0)
때문에 필요하지 않은this
A는Number
객체가
답변
accounting.js 는 숫자, 돈 및 통화 형식을위한 작은 JavaScript 라이브러리입니다.
답변
amount가 숫자 -123
라면
amount.toLocaleString('en-US', { style: 'currency', currency: 'USD' });
문자열을 생성합니다 "-$123.00"
.
다음은 완전한 작업 예 입니다.