숫자를 통화 문자열로 형식화하는 방법은 무엇입니까?


1845

JavaScript로 가격을 형식화하고 싶습니다. float인수로 인수를 사용하고 다음과 string같은 형식을 반환하는 함수를 원합니다 .

"$ 2,500.00"

가장 좋은 방법은 무엇입니까?


8
더가 내장되어 기능을 formatNumber자바 스크립트는
zerkms하지

500
장래에 이것을 읽는 사람에게는 플로트를 사용하여 통화를 저장 하지 마십시오 . 정밀도와 데이터가 느슨해집니다. 정수 센트 (또는 페니 등)로 저장 한 다음 출력 전에 변환해야합니다.
Philip Whitehouse

8
@ user1308743 Float는 소수점 이하 자릿수를 저장하지 않습니다. 값, 기준 및 오프셋을 사용하여 숫자를 저장합니다. 0.01은 실제로 표현할 수 없습니다. 참조 : en.wikipedia.org/wiki/Floating_point#Accuracy_problems
Philip Whitehouse

6
@ user1308743 : 당신이 매우 큰 숫자를 대표한다고 상상해보십시오 (당신이 운이 좋은 사람이고 은행 계좌 잔고라고 가정하십시오). 정밀한 결함 때문에 돈을 잃고 싶습니까?
ereOn

163
그렇다면 왜 다음을 제안하지 않았습니까? (2500) .toLocaleString ( "en-GB", {style : "currency", 통화 : "GBP", minimumFractionDigits : 2}) developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/…
Nick Grealy

답변:


1792

숫자 프로토 타입

이 솔루션은 모든 주요 브라우저마다 호환됩니다.

  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]그렇지 않으면 달러 기호가 표시되지 않습니다.
Jason

744
사람들이 왜이 코드가 아름답다고 생각하는지 모르겠습니다. 해독 할 수 없습니다. 잘 작동하는 것 같지만 아름답지는 않습니다.
usr

86
이 formatMoney 함수가 축소 된 JavaScript 코드에서 어딘가에 복사 되었습니까? 원본을 게시 할 수 없습니까? 변수 c, d, i, j, n, s 및 t는 무엇을 의미합니까? 이 게시물의 의견과 의견 수로 판단하면이 코드가 모든 곳에서 프로덕션 웹 사이트에 붙여 져 있다고 가정 할 수 있습니다 ... 언젠가 버그가 있으면 코드를 유지하는 것이 좋습니다.
zuallauz

259
"시"? 더 모호한 것. 이것은 코드 골프가 아닙니다. 약간의 공백을 사용하십시오. 적절한 var 이름도 아프지 않을 것입니다.
keithjgrant


1511

국제 숫자 형식

Javascript에는 숫자 포맷터 (Internationalization 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과 Number.prototype.toLocaleString

이것을 이전과 비교하는 마지막 메모. toLocaleString. 둘 다 본질적으로 동일한 기능을 제공합니다. 그러나 이전 화신 (pre-Intl)의 toLocaleString은 실제로 로케일을 지원하지 않습니다 . 시스템 로케일을 사용합니다. 따라서 올바른 버전을 사용하고 있는지 확인하십시오 ( MDN은의 존재 여부를 확인하도록 제안합니다Intl ). 또한 두 항목 의 성능은 단일 항목에 대해 동일 하지만 서식을 지정할 숫자가 많은 경우 사용 Intl.NumberFormat속도가 ~ 70 배 빠릅니다. 사용하는 방법은 다음과 같습니다 toLocaleString.

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

브라우저 지원에 대한 참고 사항

  • 전 세계적으로 97.5 %, 미국에서 98 %, EU에서 99 %를 지원하는 브라우저 지원은 더 이상 문제가되지 않습니다.
  • 심은IE8과 같은 화석화 된 브라우저에서이를 지원 이 있습니다.
  • 자세한 정보 는 CanIUse 를 보십시오

89
이 독창적 인 JavaScript, 간단하고 우아한 솔루션은 내가 찾던 것입니다.
Guilhem Soulas

9
기본적으로 작동하는 어리석은 간단한 답변이기 때문에이 질문에 투표하십시오.
Trasiva

17
꽤 많은 브라우저가 이제 이것을 지원합니다. 이것은 훨씬 더 많이지지되어야한다.
flq

2
이것은 훌륭한 답변이며 동적 통화 값으로 작업하므로 유럽에서 사용하는 경우 EUR로 변경되고 유로 기호를 표시합니다. 치료를한다!
Sprose

3
2018 년이며 기본적으로 모든 곳에서 지원됩니다. 이것이 정답이어야합니다.
sarink

1340

짧고 빠른 솔루션 (모든 곳에서 작동!)

(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/


21
나는 실제로 한 걸음 더 나아 갔다 .replace(/(\d)(?=(\d{3})+(?:\.\d+)?$)/g, "$1,").
kalisjoshua

4
VisioN 및 kalisjoshua regexp가 포함 된 CoffeeScript 버전 및 소수점 이하 자릿수 지정 방법 (기본값은 2로 두거나 소수점없이 0을 지정할 수 있음) :Number.prototype.toMoney = (decimal=2) -> @toFixed(decimal).replace /(\d)(?=(\d{3})+(?:\.\d+)?$)/g, "$1,"
Eric Anderson

11
그래 @Abbas 교체 \.와 함께 $(라인 끝), 즉 this.toFixed(0).replace(/(\d)(?=(\d{3})+$)/g, "$1,").
VisioN

2
@hanumant 정규 문법은 여기에서 약간 복잡하므로 정규 표현식에 대한 매뉴얼을 먼저 읽으십시오 (예 : MDN ). 그 뒤에있는 아이디어는 일치하는 섹션을 첫 번째 일치 및 쉼표로 바꾸는 것입니다 $1,. 일치는 lookahead 접근법을 사용하여 수행됩니다 . "3 개의 숫자 세트 (하나 이상)의 시퀀스와 점으로 구성된 숫자와 일치하는 경우"와 같이 표현식을 읽을 수 있습니다 .
VisioN

2
@ JuliendePrabère이 방법으로 작동하지 않는 긴 숫자의 예를 제시하십시오.
VisioN

248

JavaScript Number 객체를 살펴보고 도움이 될 수 있는지 확인하십시오.

  • toLocaleString() 위치 별 천 단위 구분 기호를 사용하여 숫자를 형식화합니다.
  • toFixed() 숫자를 특정 소수점 이하 자릿수로 반올림합니다.

이들을 동시에 사용하려면 값이 모두 문자열로 출력되므로 유형이 숫자로 다시 변경되어야합니다.

예:

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

2
감사! 이 아이디어를 바탕으로 짧고 간단한 것을 만들 수있었습니다! (그리고 현지화) 우수합니다.
Daniel Magliola

7
실제로 당신은 할 수 있습니다. 즉 달러 : '$'+ (value + 0.001) .toLocaleString (). slice (0, -1)
Zaptree

6
그것은 좋을 것 같지만, 현재로서는 브라우저 지원이 거의 없습니다
acorncom

1
@acorncom 왜 "작은 브라우저 지원"이 있다고 말합니까? Number 객체는 Javascript 1.1부터 사용되었습니다. 귀하의 주장을 뒷받침하는 참조를 제공하십시오.
Doug S

2
toLocaleString시스템 로케일을 사용 하는 이전 버전 과 ECMAScript Intl API에서 제공하는 새로운 (호환되지 않는) 버전이 있으므로주의해야합니다 . 여기에 설명했다 . 이 답변은 이전 버전을위한 것 같습니다.

162

아래는 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));

사소한 변경 사항은 다음과 같습니다.

  1. Math.abs(decimals)이 아닌 경우에만 수행 할 비트를 이동했습니다 NaN.

  2. decimal_sep 더 이상 빈 문자열이 될 수 없습니다 (소수 구분 기호는 필수입니다)

  3. 우리 는 인수가 JavaScript 함수로 전송되지 않는지를 결정하는 가장 좋은 방법에typeof thousands_sep === 'undefined' 제안 된대로 사용 합니다.

  4. (+n || 0)때문에 필요하지 않은 thisA는 Number객체가

JS 피들


8
parseInt에서 기수로 '10'을 사용할 수 있습니다. 그렇지 않으면 '0'으로 시작하는 숫자는 8 진수를 사용합니다.
sohtimsso1970

3
@ sohtimsso1970 : 늦게 응답해서 죄송하지만 더 설명해 주시겠습니까? 숫자가 8 진수로 해석 될 수있는 곳을 보지 못했습니다. 는 parseInt수의 정수 부분의 절대 값을이라한다. INTEGER 부분은 단지 ZERO가 아니면 ZERO로 시작할 수 없습니다! 그리고 parseInt(0) === 08 진수 나 10 진수.
Marco Demaio

예를 들어 try : parseInt ( "016") ... 문자열이 0으로 시작하면 parseInt는 8 진수로 인코딩 된 것으로 가정하므로 14를 반환합니다.
Tracker1

4
@ Tracker1 :로 시작하는 숫자 0는로 8 진수로 간주됩니다 parseInt. 그러나이 코드에서는 전달 된 인수 가 함수에 의해 첫 번째로 처리 되므로 입력 (또는 다른 8 진 형식 값) parseInt으로 수신하는 것이 불가능 합니다. 그래서 방법이 없습니다 그냥 없거나 않는 한 제로로 시작하는 번호를 받게하는 ( 소수이다)은. 그러나 문자열 과 문자열은 필요 에 따라 일반 ZERO로 변환됩니다 . 016parseIntMath.absparseInt0.nnnn00.nnparseInt
마르코 데마 이오

이 기능이 잘못되었습니다 :> (2030) .toMoney (0, '.', ''); < "2 03 0"
Anton P Robul

124

accounting.js 는 숫자, 돈 및 통화 형식을위한 작은 JavaScript 라이브러리입니다.


그냥 ... IE7과 IE8에서 그렇지 않으면 오류를 통화 기호를 전달하는 기억, IE9는 좋은 방법 중 하나입니다
벡터

2
IE7 / IE8 버그가 수정 된 것 같습니다.
Mat Schaffer

2
모든 통화 세부 사항이 하나의 함수 호출 / 설정에 포함되어 있기 때문에이 또한 통화 기호를 통과 할 수있는, 좋은 생각 좋은 라이브러리입니다
farinspace

2
나는 당신이 반대로 할 수 있다는 사실을 좋아합니다-형식이 지정된 통화 문자열을 전달하고 숫자 값을 얻습니다.
Neil Monroe

2
accounting.js는 요즘 유지되지 않는 것 같습니다. 최근 변경 한 포크는 github.com/nashdot/accounting-js
RationalDev가 GoFundMonica 좋아

124

amount가 숫자 -123라면

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

문자열을 생성합니다 "-$123.00".

다음은 완전한 작업 입니다.


7
이 대답은 거의 저에게 있었지만 가장 가까운 페니로 반올림해야했습니다. 이것이 내가 사용한 것입니다 amount.toLocaleString ( 'en-GB', {style : 'currency', currency : 'GBP', maximumFractionDigits : 2});
니코

위의 코드는 원하는 자릿수로 반올림합니다. 예를보고 입력 상자에 1.237을 입력하십시오.
Daniel Barbalace

3
Safari에서 작동하지 않는 것 같습니다. 서식을 지정하지 않고 숫자를 문자열로 반환합니다.
랜스 앤더슨

1
와우, 이것은 정말 좋은 답변입니다. 상단에 있어야합니다.
Ethan

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 에서 형식이 변경되고 빌려 왔습니다.

당신은 당신의 통화 지정자를 제공해야합니다 (위의 $를 사용했습니다).

다음과 같이 호출하십시오 (단, args의 기본값은 2, 쉼표 및 마침표이므로 선호하는 경우 args를 제공 할 필요가 없습니다).

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

글로벌 사인 조심, i, j
hacklikecrack

6
@hacklikecrack, 모든 변수는 로컬입니다; 그들은 var진술에 있습니다.
Jonathan M

3
미안하지만, 당신은 주장을 다시 선언하고 있지만. 들여 쓰기! ;)
hacklikecrack

변수 이름의 끔찍한 사용!
Serj Sagan

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"

편집 : 이제 음수도 처리합니다.


시. 훌륭한. reverse ()를 제거해야하는 reduceRight () developer.mozilla.org/en/JavaScript/Reference/Global_Objects/… 를 사용해 보셨습니까 ?
Steve

1
@Steve-당신 말이 맞지만 i = orig.length - i - 1콜백 과 같은 것을해야합니다 . 여전히 배열의 순회가 적습니다.
Wayne

11
호환성에 대한 정보 :이 reduce방법은 Ecmascript 1.8에서 도입되었으며 Internet Explorer 8 이하에서는 지원되지 않습니다.
Blaise

@Blaise가 말했듯 이이 방법은 IE 8 이하에서는 작동하지 않습니다.
rsbarro

예, 물론 맞습니다. 답변 자체에서 언급했듯이 이것은 재미를위한 것입니다. 또한 음수를 잘 처리해야합니다.
Wayne

76

모든 현재 브라우저에서 작동

ISO 4217 통화 코드를 toLocaleString사용하여 언어를 구분하여 표시하는 형식으로 통화를 사용하십시오 .

(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
동의하지만 모든 브라우저에서 완벽하게 지원되지는 않지만 여전히 솔루션입니다. (그리고 아마도 지원되지 않는 브라우저와 호환되는 가장 유효한 솔루션이며 Javascript API의 문서화 된 기능입니다.)
Nick Grealy

1
나는 이것을 좋아하고 그것이 인도 숫자 그룹과 함께 작동한다는 것을 기쁘게 생각합니다.
MSC

7
이것은 2017 년 현재 완벽하게 지원되며 유일한 정답이어야합니다
Evgeny

1
최신 및 가장 큰 :) FF69, Chrome76 등 "R 2 500,00"은 여기서 사용하는 것이 아니며 en-GB와 동일한 "R 2,500.00"이어야합니다.
avenmore

70

당신이 원하는 것은 f.nettotal.value = "$" + showValue.toFixed(2);


@ crush이 작동하지만 더 이상 세금 필드에 계산을 수행하지 않습니까?
Rocco The Taco

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.71"이 아닌 "£ 3.70"으로 형식화됩니다.
Ates Goral

그렇습니다. 제가 다루고있는 금액이 이미 최대 2 자리 숫자이기 때문에 제 경우에는 괜찮습니다. 소수를 2 자리로 수정해야하는 이유는 소수가 없거나 1 만있는 금액입니다.
Daniel Magliola

26

도서관 Globalize를 사용합니다 (Microsoft에서 제공).

숫자, 통화 및 날짜를 ​​현지화하고 사용자 로캘에 따라 올바른 형식으로 자동 지정하는 훌륭한 프로젝트입니다! ... jQuery 확장이어야하지만 현재 100 % 독립적 인 라이브러리입니다. 나는 당신이 그것을 시도하는 것이 좋습니다! :)


3
와, 왜이게 더 많이지지되지 않습니까? 모든 종류의 서식을위한 큰 표준화 된 라이브러리. 올바른 세계화를 사용하는 산업 표준 형식화 매개 변수. 좋은 대답 !!
pbarranis

그것은 여전히 ​​알파 단계로 간주되므로 조심스럽게 사용하십시오.
Neil Monroe

1
더 이상 알파 (또는 베타)가 아닙니다. 이것은 Safari가 새로운 표준을 충족하고 IE <11이 종료되기를 기다리는 동안 매우 유용합니다.
Guy Schalnat

25

자바 스크립트 번호 포맷터 (이전의 Google Code )

  • 짧고 빠르며 유연하지만 독립형입니다. MIT 라이센스 정보, 빈 줄 및 설명을 포함하여 75 줄만.
  • 부정적 #,##0.00이거나 부정적으로 표준 숫자 형식을 수락-000.#### .
  • 같은 국가 형식 승인 # ##0,00, #,###.##, #'###.##비 번호 매기기 기호 또는 어떤 종류.
  • 숫자 그룹화를 허용하십시오. #,##,#0.000또는 #,###0.##모두 유효합니다.
  • 중복 / 완전 방지 형식을 수락하십시오. ##,###,##.#또는 0#,#00#.###0#모두 괜찮습니다.
  • 자동 번호 반올림.
  • 간단한 인터페이스, 다음과 같이 마스크 및 값을 제공하십시오 format( "0.0000", 3.141592).
  • 마스크에 접두사 및 접미사 포함

(README에서 발췌)


23

원래 방법을 제공 한 Jonathan M에게 +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는 변수가 이미 함수 선언에 선언되어 있기 때문에 다소 이상합니다. 그 외에는 고마워요!
Rich Bradshaw

2
네가 옳아. 그것은 Jonathan M의 원본에서 가져온 오류이며 모두 단일 var 표현식으로 연결됩니다. 그것들은 간단한 과제 여야합니다. 고정.
XML

그 문제에 대해서는 이것이 조기에 최적화 된 것으로 가독성을 위해 리팩터링해야한다고 생각합니다. 그러나 내 목표는 기본적으로 변경하지 않고 OP의 코드를 보강하는 것이 었습니다.
XML

그것은 나쁘지 않다 – 그것은 +n || 0조금 이상하게 보이는 유일한 것이다 (어쨌든 나에게).
Rich Bradshaw

2
this완벽하게 유용한 변수 이름입니다. nRAM과 대역폭이 KB 단위로 계산 된 시대에는 정의 시간에 3자를 절약 할 수 있도록 변환하는 것이 필요할 수 있지만, 마이너가 프로덕션에 닿기 전에 모든 것을 처리하는 시대에는 단지 난독 화일뿐입니다. 다른 영리한 미세 최적화는 논쟁의 여지가 있습니다.
XML

22

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'Great! 감사합니다
Anton P Robul

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)
)


훌륭한 코드 스 니펫, 감사합니다. 그러나 <IE11에서는 기본 매개 변수가 지원되지 않고 "const"및 "let"이 지원되지 않으므로 IE에서는 작동하지 않으므로주의하십시오. 이 문제를 해결하려면 : + moneyFormat : function (price, sign) {+ if (! sign) sign = '$'; + 조각 = parseFloat (price) .toFixed (2) .split ( '') + var ii = pieces.length-3
Charlie Dalsass

@CharlieDalsass는 걱정할 필요가 없습니다. babel을 사용하여 프로덕션 코드를 위해 ES5로 컴파일하는 것이 좋습니다.
synthet1c

그러나 유로 통화를 수행하는 방법? 1,000 유로?

@YumYumYum 유연성을 높이기 위해 더 많은 서식 옵션이 포함 된 전체 예제를 추가했습니다.
synthet1c

18

패트릭 데 자르 딘 의 대답은 좋아 보이지만 자바 스크립트는 간단합니다. 여기에 숫자를 가져 와서 통화 형식으로 반환하기 위해 작성한 함수가 있습니다 (달러 기호 빼기)

// 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 에서는 toFixedjavascript

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

이 답변은 중복되어 보입니다. Crush의 답변은 이미 언급되었습니다toFixed()
Ian Dunn

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
간단하지만 1,000에 대한 쉼표는 없습니다
aron

15

Google Visualization API 의 NumberFormat 클래스를 제안합니다 .

다음과 같이 할 수 있습니다 :

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

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

도움이 되길 바랍니다.


14

이것은 조금 늦을 수도 있지만, 여기에는 동료 .toCurrencyString()가 모든 숫자에 로케일 인식 기능을 추가하기 위해 일한 방법이 있습니다 . 내재화는 통화 기호가 아닌 숫자 그룹화만을위한 것입니다. 달러를 출력하는 경우 일본이나 중국의 경우 미국 의 경우와 동일한 USD의 수 "$"이므로 제공된대로 사용 하십시오. 유로 등을 출력하는 경우 통화 기호를$123 4567$1,234,567"$" .

사용하기 직전에 HEAD의 어느 곳이나 필요한 곳에서 이것을 선언하십시오.

  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);
    }
}

2010/08/30에 편집 : 십진수 자릿수 설정 옵션이 추가되었습니다. 2011/08/23에서 편집 : 십진수 자릿수를 0으로 설정하는 옵션이 추가되었습니다.


toLocaleString의 요점은 사용자 설정에 따라 조정된다는 것입니다.
Joseph Lennox

11

복사 및 붙여 넣기를 테스트하려면 This 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 (precision) .split ( '.')에서 var multiplier = Math.pow (10, precision + 1), wholeNumber = Math.floor (this * multiplier)로 변경 ; var a = Math.round (wholeNumber / 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이 값의 모든 10 진수는 .83이 아니어야합니다. .83
vee


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

accounting.js 에서 이것을 찾았습니다 . 매우 쉽고 완벽하게 내 요구에 맞습니다.

// Default usage:
accounting.formatMoney(12345678); // $12,345,678.00

// European formatting (custom symbol and separators), can also use options object as second parameter:
accounting.formatMoney(4999.99, "€", 2, ".", ","); // €4.999,99

// Negative values can be formatted nicely:
accounting.formatMoney(-500000, "£ ", 0); // £ -500,000

// Simple `format` string allows control of symbol position (%v = value, %s = symbol):
accounting.formatMoney(5318008, { symbol: "GBP",  format: "%v %s" }); // 5,318,008.00 GBP

// 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" } ) );
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.