sourcecode

숫자 형식을 통화 문자열로 지정하는 방법

copyscript 2022. 11. 17. 21:23
반응형

숫자 형식을 통화 문자열로 지정하는 방법

가격을 자바스크립트로 포맷하고 싶습니다.이 기능을 사용하고 싶습니다.floatstring을 사용하다

"$ 2,500.00"

이거 어떻게 해?

국제 번호포맷

JavaScript에는 숫자 형식(국제화 API의 일부)이 있습니다.

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

  // These options are needed to round to whole numbers if that's what you want.
  //minimumFractionDigits: 0, // (this suffices for whole numbers, but will print 2500.10 as $2,500.1)
  //maximumFractionDigits: 0, // (causes 2500.99 to be printed as $2,501)
});

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

undefined 인수 「」 「」 「」 「」) 합니다.'en-US'이 예에서는 시스템로케일(코드가 브라우저에서 실행되고 있는 경우의 사용자 로케일)을 사용합니다.로케일 코드의 상세 설명.

여기 통화 코드 목록이 있습니다.

국제 번호포맷과 Number.protype.toLocaleString

★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★toLocaleString둘 다 기본적으로 동일한 기능을 제공합니다.단, 이전 버전(Pre-Intl)의 toLocaleString은 실제로 로케일을 지원하지 않습니다.시스템 로케일을 사용합니다.따라서 오래된 브라우저를 디버깅할 때는 올바른 버전을 사용하고 있는지 확인하십시오(MDN은 이 존재하는지 확인하는 것이 좋습니다).오래된 브라우저는 신경 쓰지 않고 심만 사용해도 전혀 걱정할 필요가 없습니다.

또한 하나의 항목에 대해 둘 다 성능은 동일하지만 포맷할 숫자가 많은 경우,Intl.NumberFormat~70년따라서 보통 사용하는 것이 가장 좋습니다.Intl.NumberFormat페이지 로드당 한 번만 인스턴스화합니다.요,그러면요.toLocaleString:

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

브라우저 지원 및 Node.js에 관한 주의사항

  • 브라우저 지원은 현재 전 세계적으로 98%, 미국에서는 99%, EU에서는 99%가 지원되므로 더 이상 문제가 되지 않습니다.
  • 화석화된 브라우저(Internet Explorer 8 등)에서 이를 지원하는 이 있습니다.꼭 필요한 경우
  • 이전 Node는 v13 Node.js만 합니다.en-US바로 사용할 수 있습니다.하나의 솔루션은 풀 ICU를 설치하는 것입니다.자세한 내용은 여기를 참조하십시오.
  • Can을 보다자세한 내용은 이쪽

Number.protype.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>

짧고 빠른 솔루션(어디서나 사용 가능)

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

에 있는 을 첫 쉼표로 입니다. " " " " " " " " " " " " 는 " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " ""'$&,'매칭은 선행접근법을 사용하여 이루어집니다.표현은 "숫자 뒤에 3개의 숫자 집합(1개 이상)과 도트가 이어지는 경우 일치"로 읽을 수 있습니다.

테스트:

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/


확장 쇼트 솔루션

오브젝트의 프로토타입을 확장하여 임의의 수의 소수점 지원을 추가할 수도 있습니다.[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()

편집

LocaleString을 직접 사용하면 됩니다.숫자에 재캐스팅할 필요는 없습니다.

someNumber.toLocaleString(undefined, {minimumFractionDigits: 2, maximumFractionDigits: 2});

복수 번호

유사한 형식의 숫자를 자주 사용해야 하는 경우 재사용할 특정 개체를 생성할 수 있습니다.독일어(스위스):

const money = new Intl.NumberFormat('de-CH',
  { style:'currency', currency: 'CHF' });
const percent = new Intl.NumberFormat('de-CH',
  { style:'percent', maximumFractionDigits: 1, signDisplay: "always"});

다음과 같이 사용할 수 있습니다.

money.format(1234.50); // output CHF 1'234.50
percent.format(0.083);  // output +8.3%

꽤 괜찮네요.

다음은 Patrick Desjardins(일명 Daok) 코드와 약간의 코멘트가 추가되어 있습니다.

/*
decimal_sep: character used as decimal separator, 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 the 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 [https://stackoverflow.com/questions/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. 는 용하고다 we를 사용한다typeof thousands_sep === 'undefined'"인수가 JavaScript 함수로 전송되지 않았는지 여부를 확인하는 최선의 방법"에서 제시된 바와 같이

  4. (+n || 0)는, 「」이기 때문에 필요 .this는 입니다.Number 표시

JSFiddle

숫자이면 '아까운가보다'라고 말해요.-123 (그래서)

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

됩니다."-$123.00".

여기 완전한 작업 예가 있습니다.

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

다음은 제가 본 최고의 JavaScript 머니포맷입니다.

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

다시 포맷하여 여기서 빌렸습니다.숫자 형식을 통화 문자열로 지정하는 방법

지정자를 사용하셨습니다).$( ) 참참참참주 。

다음과 같이 호출합니다(단, 인수는 기본적으로 2, 쉼표 및 마침표로 설정되므로 원하는 경우 인수를 지정할 필요가 없습니다).

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

다음은 재미삼아 또 다른 시도입니다.

function formatDollar(num) {
    var p = num.toFixed(2).split(".");
    return "$" + p[0].split("").reverse().reduce(function(acc, num, i, orig) {
        return num + (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"
formatDollar(-1345) // "$-1,345.00
formatDollar(-3) // "$-3.00"

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

toLocaleStringISO 4217 통화 코드를 사용하여 언어에 민감한 표현으로 통화 형식을 지정합니다.

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

남아프리카 공화국 랜드 코드 스니펫의 예: 복수:

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

좋아, 네가 한 말에 따르면, 난 이걸 쓰고 있어.

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를 포함시키지 않는 것이 좋습니다:-)

소수 구분 기호로 사용하는 대신 ""를 감지해야 한다는 건 이미 알고 있어요

Numeral.js - @adamwdraper에 의한 간단한 번호 포맷을 위한 JavaScript 라이브러리

numeral(23456.789).format('$0,0.00'); // = "$23,456.79"

다음은 간결하고 이해하기 쉬우며 지나치게 복잡한 정규 표현에 의존하지 않습니다.

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

Microsoft의 Globalize 라이브러리를 사용하고 있습니다.

숫자, 통화 및 날짜를 현지화하고 사용자 로케일에 따라 올바른 형식으로 자동 지정하는 것은 매우 좋은 프로젝트입니다.jQuery 확장자여야 하지만 현재는 100% 독립적인 라이브러리입니다.여러분들도 꼭 시험해 보세요! :)

네이티브 javascript Interl을 사용하면 됩니다.

값을 포맷하는 옵션만 사용합니다.

const number = 1233445.5678
console.log(new Intl.NumberFormat('en-US', { style: 'currency', currency: 'USD' }).format(number));

모질라 문서 링크

javascript-number-formatter(구 Google 코드)

  • 짧고, 빠르고, 유연하면서도 스탠드아론.
  • 표준 번호 을 받아들입니다.와 같은 표준 합니다.#,##0.00 -000.####.
  • 다음과 같은 국가 형식을 수락합니다.# ##0,00,#,###.##,#'###.##또는 모든 유형의 비점수 기호입니다.
  • 이치노 #,##,#0.000 ★★★★★★★★★★★★★★★★★」#,###0.##모두 유효합니다.
  • 중복/불합격 포맷을 모두 수락합니다. ##,###,##.# ★★★★★★★★★★★★★★★★★」0#,#00#.###0#괜찮
  • 자동 번호 반올림
  • 마스크와 합니다.마스크와 값을 다음과 같이 입력합니다.format( "0.0000", 3.141592).
  • 마스크에 접두사와 접미사를 포함하다

(README에서 제외)

정규식을 사용하여 공간, 쉼표 또는 점을 삽입하는 더 짧은 방법:

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

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

+1은 Jonathan M에게 원래의 방법을 제공한다.이것은 통화 형식이기 때문에 통화 기호(기본값은 $')를 출력에 추가하고 기본 쉼표를 천 구분 기호로 추가했습니다.실제로 통화 기호(또는 수천 구분 기호)를 원하지 않는 경우 인수로 "("빈 문자열")을 사용하십시오.

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

주요 부분은 천 구분자를 삽입하는 것으로, 다음과 같이 할 수 있습니다.

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

아래 코드를 입력해 주세요.

"250000".replace(/(\d)(?=(\d{3})+(?!\d))/g, '$1,');

응답: 250,000

여기에 이미지 설명을 입력하십시오.

PHP 함수 "number_format"의 JavaScript 포트가 있습니다.

사용하기 쉽고 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 Internet Explorer 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'

Patrick Desjardins의 답변은 좋아 보이지만, 나는 내 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];
}

JavaScript에는 toFixed라는 함수가 내장되어 있습니다.

var num = new Number(349);
document.write("$" + num.toFixed(2));
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;
}

윌마스터님.

번호를 권장합니다.Google 시각화 API의 형식 클래스입니다.

다음과 같은 작업을 수행할 수 있습니다.

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

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

보통 , 저는 같은 일을 하는 방법으로는 하지 않습니다.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);
    }
}

일 인식하다, 로케일 인식하다, 로케일 인식하다를 ..toCurrencyString()모든 숫자에 대해 기능합니다.내부화는 숫자 그룹화를 위한 것일 뿐 통화 기호가 아닙니다. 달러를 출력하는 경우 다음을 사용하십시오."$" 「」는 「」이기 때문에, 「」$123 4567에서 미국 .$1,234,567국에있있 있있있다다를 「유로」에서 해 주세요."$".

HTML <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"

Number(value)
        .toFixed(2)
        .replace(/(\d)(?=(\d{3})+(?!\d))/g, "$1,")

다음은 몇 가지 솔루션으로 모두 테스트 스위트를 통과했습니다.테스트 스위트와 벤치마크가 포함되어 있습니다.카피 앤 페이스트 테스트의 경우는, 다음의 요점을 시험해 주세요.

메서드 0(RegExp)

VisioN의 답변을 기반으로 하지만 소수점이 없으면 수정됩니다.

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, the 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();

언급URL : https://stackoverflow.com/questions/149055/how-to-format-numbers-as-currency-strings

반응형