programing

숫자의 형식을 지정하는 방법?

jooyons 2023. 7. 29. 08:23
반응형

숫자의 형식을 지정하는 방법?

자바스크립트를 사용하여 숫자를 포맷하고 싶습니다.

예:

10     => 10.00
100    => 100.00
1000   => 1,000.00
10000  => 10,000.00
100000 => 100,000.00

기본 제공 코드를 사용하려면 다음과 같이 사용할 수 있습니다.minimumFractionDigits.

의 확장 옵션에 대한 브라우저 호환성toLocaleString()처음 이 답변을 작성했을 때는 제한적이었지만, 현재 상태는 좋아 보입니다.Node.js를 사용하는 경우 다음 작업이 필요합니다.npm install꾸러미

var value = (100000).toLocaleString(
  undefined, // leave undefined to use the visitor's browser 
             // locale or a string like 'en-US' to override it.
  { minimumFractionDigits: 2 }
);
console.log(value);

숫자 형식은 문화에 따라 다릅니다.출력에 1대한 문자열 비교를 수행하지 않는 한, 수행해야 할 예의는 선택하는 것입니다.undefined방문자의 브라우저가 가장 2익숙한 형식을 사용하도록 합니다.

// Demonstrate selected international locales
var locales = [
  undefined,  // Your own browser
  'en-US',    // United States
  'de-DE',    // Germany
  'ru-RU',    // Russia
  'hi-IN',    // India
  'de-CH',    // Switzerland
];
var n = 100000;
var opts = { minimumFractionDigits: 2 };
for (var i = 0; i < locales.length; i++) {
  console.log(locales[i], n.toLocaleString(locales[i], opts));
}

위와 다른 형식의 문화권 출신인 경우 이 게시물을 편집하고 로케일 코드를 추가하십시오.


1 그래서는 안 됩니다.
2 분명히 이것을 통화에 사용하지 마십시오.{style: 'currency', currency: 'JPY'}당신이 현지 환율로 전환하지 않는 한.당신은 당신의 웹사이트가 사람들에게 가격이 300달러라고 말하는 것을 원하지 않을 것입니다. 그것은 정말로 300달러입니다.때때로 실제 전자 상거래 사이트는 이러한 실수를 합니다.

간단한 해결책:

var n = 1234567890;
String(n).replace(/(.)(?=(\d{3})+$)/g,'$1,')
// "1,234,567,890"

사용하다

num = num.toFixed(2);

여기서 2는 소수 자릿수입니다.

편집:

원하는 번호 형식을 지정할 수 있는 기능은 다음과 같습니다.

function formatNumber(number)
{
    number = number.toFixed(2) + '';
    x = number.split('.');
    x1 = x[0];
    x2 = x.length > 1 ? '.' + x[1] : '';
    var rgx = /(\d+)(\d{3})/;
    while (rgx.test(x1)) {
        x1 = x1.replace(rgx, '$1' + ',' + '$2');
    }
    return x1 + x2;
}

출처: www.mredkj.com

이제 모든 비익스커브 브라우저(일부 구식 브라우저도 포함)는 를 제공하는 ECMAcript® Internationalization API 사양(ECMA-402)을 지원합니다.이 기능을 사용할 수 있습니다.

const nFormat = new Intl.NumberFormat();
const count = 42000000;
console.log(nFormat.format(count)); // 42,000,000 in many locales, 42.000.000 in many other locales

if (typeof Intl === "undefined" || !Intl.NumberFormat) {
    console.log("This browser doesn't support Intl.NumberFormat");
} else {
    const nFormat = new Intl.NumberFormat();
    const count = 42000000;
    console.log(nFormat.format(count)); // 42,000,000 in many locales, 42.000.000 in many other locales
}

JasperV가 발견한 버그로 인해 - 좋은 점!예전 코드를 다시 작성했습니다.소수점 두 자리의 양수 값에만 사용해 본 적이 있는 것 같습니다.

달성하려는 항목에 따라 반올림을 원할 수도 있고 원하지 않을 수도 있습니다. 따라서 이 분할을 통해 분할된 두 가지 버전이 있습니다.

일단 라운딩부터.

까지 소것은개한을 소개했습니다.toFixed()방법은 특정 소수점 이하의 자리로 반올림하는 것을 더 정확하게 처리하고 잘 지원됩니다.하지만 그것은 일을 느리게 합니다.

이 버전은 여전히 소수점을 분리하지만 이전과는 다른 방법을 사용합니다.w|0part는 소수점을 제거합니다.그것에 대한 더 많은 정보를 위해, 이것은 좋은 대답입니다.그러면 나머지 정수가 남아 저장됩니다.k원래 숫자에서 다시 뺀 다음 소수를 그대로 둡니다.

또한 마이너스 숫자를 고려하려면, 우리가 칠 때까지 루프(3자리 건너뛰기)를 해야 합니다.b은 이은다 같은것로을넣과않 1산습계다와 같은 때 로 계산되었습니다.-,100.00

나머지 루프는 이전과 동일합니다.

function formatThousandsWithRounding(n, dp){
  var w = n.toFixed(dp), k = w|0, b = n < 0 ? 1 : 0,
      u = Math.abs(w-k), d = (''+u.toFixed(dp)).substr(2, dp),
      s = ''+k, i = s.length, r = '';
  while ( (i-=3) > b ) { r = ',' + s.substr(i, 3) + r; }
  return s.substr(0, i + 3) + r + (d ? '.'+d: '');
};

아래의 스니펫에서 자신을 테스트하기 위해 숫자를 편집할 수 있습니다.

function formatThousandsWithRounding(n, dp){
  var w = n.toFixed(dp), k = w|0, b = n < 0 ? 1 : 0,
      u = Math.abs(w-k), d = (''+u.toFixed(dp)).substr(2, dp),
      s = ''+k, i = s.length, r = '';
  while ( (i-=3) > b ) { r = ',' + s.substr(i, 3) + r; }
  return s.substr(0, i + 3) + r + (d ? '.'+d: '');
};

var dp;
var createInput = function(v){
  var inp = jQuery('<input class="input" />').val(v);
  var eql = jQuery('<span>&nbsp;=&nbsp;</span>');
  var out = jQuery('<div class="output" />').css('display', 'inline-block');
  var row = jQuery('<div class="row" />');
  row.append(inp).append(eql).append(out);
  inp.keyup(function(){
    out.text(formatThousandsWithRounding(Number(inp.val()), Number(dp.val())));
  });
  inp.keyup();
  jQuery('body').append(row);
  return inp;
};

jQuery(function(){
  var numbers = [
    0, 99.999, -1000, -1000000, 1000000.42, -1000000.57, -1000000.999
  ], inputs = $();
  dp = jQuery('#dp');
  for ( var i=0; i<numbers.length; i++ ) {
    inputs = inputs.add(createInput(numbers[i]));
  }
  dp.on('input change', function(){
    inputs.keyup();
  });
});
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<input id="dp" type="range" min="0" max="5" step="1" value="2" title="number of decimal places?" />

이제 다른 버전은 반올림하지 않습니다.

이는 다른 경로를 사용하여 수학적 계산을 피하려고 합니다(반올림 또는 반올림 오차가 발생할 수 있음).반올림을 원하지 않는 경우 문자열로만 처리됩니다. 즉, 소수점 이하 두 자리로 변환된 1000.999는 1001.00이 아니라 1000.99입니다.

은 이방은사않다습니지하용법▁using다않니▁avoids▁this습▁method이지를 사용하는 것을 피합니다..split()그리고.RegExp()하지만, 둘 다 비교하면 매우 느립니다.그리고 마이클의 대답을 통해 새로운 것을 알게 되었습니다.toLocaleString저는 또한 그것이 (적어도 Firefox와 Chrome, Mac OSX에서는) 그 중에서 가장 느린 방법이라는 것을 알고 놀랐습니다.

용사를 합니다.lastIndexOf()우리는 존재할 수 있는 소수점을 찾고, 거기서부터 다른 모든 것은 거의 같습니다.필요한 경우 여분의 0이 있는 패딩을 저장합니다.이 코드는 소수점 이하 5자리로 제한됩니다.제 테스트에서 이것이 더 빠른 방법이었습니다.

var formatThousandsNoRounding = function(n, dp){
  var e = '', s = e+n, l = s.length, b = n < 0 ? 1 : 0,
      i = s.lastIndexOf('.'), j = i == -1 ? l : i,
      r = e, d = s.substr(j+1, dp);
  while ( (j-=3) > b ) { r = ',' + s.substr(j, 3) + r; }
  return s.substr(0, j + 3) + r + 
    (dp ? '.' + d + ( d.length < dp ? 
        ('00000').substr(0, dp - d.length):e):e);
};

var formatThousandsNoRounding = function(n, dp){
  var e = '', s = e+n, l = s.length, b = n < 0 ? 1 : 0,
      i = s.lastIndexOf('.'), j = i == -1 ? l : i,
      r = e, d = s.substr(j+1, dp);
  while ( (j-=3) > b ) { r = ',' + s.substr(j, 3) + r; }
  return s.substr(0, j + 3) + r + 
  	(dp ? '.' + d + ( d.length < dp ? 
    	('00000').substr(0, dp - d.length):e):e);
};

var dp;
var createInput = function(v){
  var inp = jQuery('<input class="input" />').val(v);
  var eql = jQuery('<span>&nbsp;=&nbsp;</span>');
  var out = jQuery('<div class="output" />').css('display', 'inline-block');
  var row = jQuery('<div class="row" />');
  row.append(inp).append(eql).append(out);
  inp.keyup(function(){
    out.text(formatThousandsNoRounding(Number(inp.val()), Number(dp.val())));
  });
  inp.keyup();
  jQuery('body').append(row);
  return inp;
};

jQuery(function(){
  var numbers = [
    0, 99.999, -1000, -1000000, 1000000.42, -1000000.57, -1000000.999
  ], inputs = $();
  dp = jQuery('#dp');
  for ( var i=0; i<numbers.length; i++ ) {
    inputs = inputs.add(createInput(numbers[i]));
  }
  dp.on('input change', function(){
    inputs.keyup();
  });
});
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<input id="dp" type="range" min="0" max="5" step="1" value="2" title="number of decimal places?" />

곧 페이지 내 스니펫 데모로 업데이트하겠지만, 지금은 바이올린이 있습니다.

https://jsfiddle.net/bv2ort0a/2/



이전 방법

이에 RegExp를 사용하는 이유는 무엇입니까?이쑤시개로 이쑤시개를 사용할 수 있을 때는 망치를 사용하지 마십시오. 즉, 끈 조작을 사용합니다.

var formatThousands = function(n, dp){
  var s = ''+(Math.floor(n)), d = n % 1, i = s.length, r = '';
  while ( (i -= 3) > 0 ) { r = ',' + s.substr(i, 3) + r; }
  return s.substr(0, i + 3) + r + 
    (d ? '.' + Math.round(d * Math.pow(10, dp || 2)) : '');
};

을 통과합니다.

formatThousands( 1000000.42 );

소수점 이하의 첫 번째 스트립:

s = '1000000', d = ~ 0.42

문자열의 끝에서 뒤로 작업합니다.

',' + '000'
',' + '000' + ',000'

접미사하여 은접두와반십접마다니합추무리위여치가하를사미남수림진올사반(▁final▁to다▁rounding:▁(▁suffix위니▁addingwith▁and치▁theise▁by합:dp소수점):

'1' + ',000,000' + '.42'

말도 안 돼.

http://jsfiddle.net/XC3sS/

함수 toFixed이 함수를 사용하여 쉼표를 추가할 수 있습니다.

function addCommas(nStr)
{
    nStr += '';
    var x = nStr.split('.');
    var x1 = x[0];
    var x2 = x.length > 1 ? '.' + x[1] : '';
    var rgx = /(\d+)(\d{3})/;
    while (rgx.test(x1)) {
        x1 = x1.replace(rgx, '$1' + ',' + '$2');
    }
    return x1 + x2;
}
n = 10000;
r = n.toFixed(2); //10000.00

addCommas(r); // 10,000.00

http://www.mredkj.com/javascript/numberFormat.html

사용을 고려해 보는 것이 좋습니다.

작업 예제:

const number = 1234567890.123;

console.log(number.toLocaleString('en-US')); // US format

console.log(number.toLocaleString('en-IN')); // Indian format

Chrome v60 및 v88에서 테스트됨

출처: Number.prototype.toLocalString() | MDN

저는 이 jQuery-number 포맷터로 당신의 문제를 해결할 수 있다고 생각합니다.

물론 이는 프로젝트에서 jQuery를 사용하는 데 문제가 없다는 것을 가정한 것입니다.기능은 블러 이벤트와 관련이 있음을 유의하시기 바랍니다.

$("#salary").blur(function(){
      $(this).parseNumber({format:"#,###.00", locale:"us"});
      $(this).formatNumber({format:"#,###.00", locale:"us"});
});
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/1.11.1/jquery.min.js"></script>

<script src="https://cdn.jsdelivr.net/gh/timdown/jshashtable/hashtable.js"></script>

<script src="https://cdn.jsdelivr.net/gh/hardhub/jquery-numberformatter/src/jquery.numberformatter.js"></script>

<input type="text" id="salary">

function numberWithCommas(x) {
  x=String(x).toString();
  var afterPoint = '';
  if(x.indexOf('.') > 0)
     afterPoint = x.substring(x.indexOf('.'),x.length);
  x = Math.floor(x);
  x=x.toString();
  var lastThree = x.substring(x.length-3);
  var otherNumbers = x.substring(0,x.length-3);
  if(otherNumbers != '')
      lastThree = ',' + lastThree;
  return otherNumbers.replace(/\B(?=(\d{2})+(?!\d))/g, ",") + lastThree + afterPoint;
}

console.log(numberWithCommas(100000));
console.log(numberWithCommas(10000000));

산출량

1,00,000
1,00,00,000

이것은 당신의 문제에 대한 기사입니다.수천 개의 구분자를 추가하는 것은 JavaScript에 내장되어 있지 않으므로 다음과 같이 사용자 자신의 함수를 작성해야 합니다(링크된 페이지에서 가져온 예).

function addSeperator(nStr){
  nStr += '';
  x = nStr.split('.');
  x1 = x[0];
  x2 = x.length > 1 ? '.' + x[1] : '';
  var rgx = /(\d+)(\d{3})/;
  while (rgx.test(x1)) {
    x1 = x1.replace(rgx, '$1' + ',' + '$2');
  }
  return x1 + x2;
}

또는 sugar.js 라이브러리와 형식 방법을 사용할 수 있습니다.

format(장소 = 0,000 = ',', 10진수 = '.) 숫자를 읽을 수 있는 문자열로 형식을 지정합니다.장소가 정의되지 않은 경우 자동으로 장소가 결정됩니다.천은 천 구분 기호에 사용되는 문자입니다.decimal은 소수점에 사용되는 문자입니다.

예:

(56782).format() > "56,782"
(56782).format(2) > "56,782.00"
(4388.43).format(2, ' ') > "4 388.43"
(4388.43).format(3, '.', ',') > "4.388,430"

제 해결책도 여기에 던져보겠습니다.저는 읽기 쉽도록 각 행에 주석을 달았고 몇 가지 예도 제공했으므로 크게 보일 수 있습니다.

function format(number) {

    var decimalSeparator = ".";
    var thousandSeparator = ",";

    // make sure we have a string
    var result = String(number);

    // split the number in the integer and decimals, if any
    var parts = result.split(decimalSeparator);

    // if we don't have decimals, add .00
    if (!parts[1]) {
      parts[1] = "00";
    }
  
    // reverse the string (1719 becomes 9171)
    result = parts[0].split("").reverse().join("");

    // add thousand separator each 3 characters, except at the end of the string
    result = result.replace(/(\d{3}(?!$))/g, "$1" + thousandSeparator);

    // reverse back the integer and replace the original integer
    parts[0] = result.split("").reverse().join("");

    // recombine integer with decimals
    return parts.join(decimalSeparator);
}

document.write("10 => " + format(10) + "<br/>");
document.write("100 => " + format(100) + "<br/>");
document.write("1000 => " + format(1000) + "<br/>");
document.write("10000 => " + format(10000) + "<br/>");
document.write("100000 => " + format(100000) + "<br/>");
document.write("100000.22 => " + format(100000.22) + "<br/>");

이렇게 하면 쉼표로 구분된 값을 얻을 수 있을 뿐만 아니라 끝에 고정 표기법을 추가할 수 있습니다.

    nStr="1000";
    nStr += '';
    x = nStr.split('.');
    x1 = x[0];
    x2 = x.length > 1 ? '.' + x[1] : '';
    var rgx = /(\d+)(\d{3})/;
    while (rgx.test(x1)) {
        x1 = x1.replace(rgx, '$1' + ',' + '$2');
    }
    commaSeperated = x1 + x2 + ".00";
    alert(commaSeperated);

원천

jQuery를 사용하는 경우 형식 또는 숫자 형식 플러그인을 사용할 수 있습니다.

 function formatNumber1(number) {
  var comma = ',',
      string = Math.max(0, number).toFixed(0),
      length = string.length,
      end = /^\d{4,}$/.test(string) ? length % 3 : 0;
  return (end ? string.slice(0, end) + comma : '') + string.slice(end).replace(/(\d{3})(?=\d)/g, '$1' + comma);
 }

 function formatNumber2(number) {
  return Math.max(0, number).toFixed(0).replace(/(?=(?:\d{3})+$)(?!^)/g, ',');
 }

출처: http://jsperf.com/number-format

이것은 승인된 답변의 약 3배 빠른 버전입니다.배열을 만들지 않고 끝에 있는 정수에 대한 개체 생성 및 문자열 연결을 방지합니다.이 기능은 테이블 등에서 많은 값을 렌더링하는 경우에 유용할 수 있습니다.

function addThousandSeparators(number) {
    var whole, fraction
    var decIndex = number.lastIndexOf('.')
    if (decIndex > 0) {
        whole = number.substr(0, decIndex)
        fraction = number.substr(decIndex)
    } else {
        whole = number
    }
    var rgx = /(\d+)(\d{3})/
    while (rgx.test(whole)) {
        whole = whole.replace(rgx, '$1' + ',' + '$2')
    }
    return fraction ? whole + fraction : whole
}
                function formatThousands(n,dp,f) {
                    // dp - decimal places
                    // f - format >> 'us', 'eu'
                    if (n == 0) {
                        if(f == 'eu') {
                            return "0," + "0".repeat(dp);   
                        }
                        return "0." + "0".repeat(dp);
                    }

                    /* round to 2 decimal places */
                    //n = Math.round( n * 100 ) / 100;
                    var s = ''+(Math.floor(n)), d = n % 1, i = s.length, r = '';
                    while ( (i -= 3) > 0 ) { r = ',' + s.substr(i, 3) + r; }
                    var a = s.substr(0, i + 3) + r + (d ? '.' + Math.round((d+1) * Math.pow(10,dp)).toString().substr(1,dp) : '');
                    /* change format from 20,000.00 to 20.000,00 */
                    if (f == 'eu') {
                        var b = a.toString().replace(".", "#");
                        b = b.replace(",", ".");
                        return b.replace("#", ",");
                    }                   
                    return a;
                }

언급URL : https://stackoverflow.com/questions/5731193/how-to-format-numbers

반응형