자바 스크립트 천 구분자 / 문자열 형식 [중복]


96

Javascript에 숫자와 문자열을 형식화하는 기능이 있습니까?

문자열 또는 숫자에 대한 천 구분 기호에 대한 방법을 찾고 있습니다 ... (C #의 String.Format처럼)



나는 당신이 거기에서 당신이 필요로하는 것을 찾을 것이라고 생각한다 :) stackoverflow.com/questions/610406/…
Jad

How to print a number with commas as thousands separators in JavaScript: stackoverflow.com/questions/2901102/...
아드 리앙은 수

답변:


160

업데이트 (7 년 후)

아래 원래 답변에 인용 된 참조가 잘못되었습니다. 가 되고 a는 정확히 어떤이에 대한 기능을 내장 카이저는 아래의 제안 :toLocaleString

따라서 다음을 수행 할 수 있습니다.

(1234567.89).toLocaleString('en')              // for numeric input
parseFloat("1234567.89").toLocaleString('en')  // for string input

아래 구현 된 기능도 작동하지만 단순히 필요하지는 않습니다.

(나는 운이 좋을 것이라고 생각하고 2010 년 필요 하다는 것을 알았지 만 그렇지 않습니다. 이보다 신뢰할 수있는 참조 에 따르면 toLocaleString은 ECMAScript 3rd Edition [1999] 이후 표준의 일부였습니다. IE 5.5까지 지원되었을 것입니다.)


원래 답변

이 참조 에 따르면 숫자에 쉼표를 추가하는 기능이 내장되어 있지 않습니다. 그러나이 페이지에는 직접 코딩하는 방법의 예가 포함되어 있습니다.

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

편집 : 다른 방법으로 이동하려면 (쉼표가있는 문자열을 숫자로 변환) 다음과 같이 할 수 있습니다.

parseFloat("1,234,567.89".replace(/,/g,''))

정말 감사합니다 //하지만 그 문자열 (쉼표 포함)을 숫자로 어떻게 변환 할 수 있습니까?
LostLord

10 만 이상의 숫자보다이 기능을 나누기
DevZer0

1
DevZer0 @ 그렇지 않습니다 아니오
이층 장롱

순수 자바 스크립트 + 단일 정규식으로 작동합니다. stackoverflow.com/a/44324879/681830
Val

4
사용 (1234567).toLocaleString().replace(/,/g," ",)수천 사이에 공백을 위해
Fanky

122

대한 경우 현지화 천 단위 구분, 구분 기호와 소수점 구분 기호를, 다음으로 이동 :

// --> numObj.toLocaleString( [locales [, options] ] )
parseInt( number ).toLocaleString();

사용할 수있는 몇 가지 옵션이 있습니다 (대체가있는 로케일도 포함).

number = 123456.7089;

result  = parseInt( number ).toLocaleString() + "<br>";
result += number.toLocaleString( 'de-DE' ) + "<br>";
result += number.toLocaleString( 'ar-EG' ) + "<br>";
result += number.toLocaleString( 'ja-JP', { 
  style           : 'currency',
  currency        : 'JPY',
  currencyDisplay : 'symbol',
  useGrouping     : true
} ) + "<br>";
result += number.toLocaleString( [ 'jav', 'en' ], { 
  localeMatcher            : 'lookup',
  style                    : 'decimal',
  minimumIntegerDigits     : 2,
  minimumFractionDigits    : 2,
  maximumFractionDigits    : 3,
  minimumSignificantDigits : 2,
  maximumSignificantDigits : 3
} ) + "<br>";

var el = document.getElementById( 'result' );
el.innerHTML = result;
<div id="result"></div>

MDN 정보 페이지 에 대한 세부 정보 .

편집 : 댓글 작성자 @I like Serena 는 다음을 추가합니다.

영어 형식이 필요한 비 영어 로케일의 브라우저를 지원하려면 value.toLocaleString('en'). 부동 소수점에서도 작동합니다.


이것은 float nums를 다루지 않습니다. parseInt를 parseFloat로 변경할 수 있지만 yourInt = "100,12"(소수 구분자로 쉼표)이면 실패합니다. 이것은 replace ( ",", ".") ..로 고칠 수 있지만 "1.000,12"로 다시 실패합니다. 그래서 ... 당신은 때때로 바퀴를 재발 명해야합니다. stackoverflow.com/a/2901298/1028304
neiker 2014

잘 작동하지 않습니다. 쉼표를 사용하지만 로케일 공간은 천 단위 구분 기호에 일반적입니다.
Josef Sábl 2014 년

1
더 적절할 것입니다.Number(yourNumberOrString).toLocaleString()
Jonathan

2
영어 형식이 필요한 비 영어 로케일의 브라우저를 지원하려면 value.toLocaleString('en'). 부동 소수점에서도 작동합니다.
Klaas van Aarsen 2015 년

1
@ Serhiog.Lazin Safari에서 정확히 작동하지 않는 것은 무엇입니까 (어떤 OS와 어떤 버전에서)?
kaiser

35

ECMAScript2018 변경 사항에 따라 look-behind 지원을 사용하여 업데이트되었습니다.
이전 버전과의 호환성을 위해 더 아래로 스크롤하여 원래 솔루션을 확인하십시오.

정규식을 사용할 수 있습니다. 특히 문자열로 저장된 큰 숫자를 처리하는 데 유용합니다.

const format = num => 
    String(num).replace(/(?<!\..*)(\d)(?=(?:\d{3})+(?:\.|$))/g, '$1,')

;[
    format(100),                           // "100"
    format(1000),                          // "1,000"
    format(1e10),                          // "10,000,000,000"  
    format(1000.001001),                   // "1,000.001001"
    format('100000000000000.001001001001') // "100,000,000,000,000.001001001001
]
    .forEach(n => console.log(n))

»자세한 정규식 설명 (regex101.com) 흐름도


이 원래 답변은 필수는 아니지만 이전 버전과의 호환성을 위해 사용할 수 있습니다.

단일 정규식 (콜백없이) 으로 이것을 처리하려고 시도하면 현재 능력이 Javascript에서 부정적인 look-behind가 없기 때문에 실패합니다. 기간 색인 뒤에 일치 색인이 나타나는 일치 항목을 무시합니다.

const format = num => {
    const n = String(num),
          p = n.indexOf('.')
    return n.replace(
        /\d(?=(?:\d{3})+(?:\.|$))/g,
        (m, i) => p < 0 || i < p ? `${m},` : m
    )
}

;[
    format(100),                           // "100"
    format(1000),                          // "1,000"
    format(1e10),                          // "10,000,000,000"  
    format(1000.001001),                   // "1,000.001001"
    format('100000000000000.001001001001') // "100,000,000,000,000.001001001001
]
    .forEach(n => console.log(n))

»자세한 정규식 설명 (regex101.com)

흐름도


이 구문 다이어그램이 regex101.com에서 생성 되었습니까?
Gerold Broser

소수가있는 숫자는 어떻게됩니까?
Emiliano

"잘못된 정규식 : 잘못된 그룹 지정자 이름"이 표시됩니다. React Native 0.59에서 이것을 수행하지만 실제로 RegEx에 영향을 미치지 않아야합니다.
Joshua Pinter

@JoshuaPinter 작성 시점에는 아직 모든 플랫폼에서 지원되지 않는 look-behind를 사용할 것입니다. 나는 당신이 특히 iOS를 언급하고 있다고 생각합니다. Safari는 여전히 나에게도 실패합니다. 지금은 이전 버전과 호환되는 버전을 사용하는 것이 가장 좋습니다. 나는 내 대답을 미래에 대비하기 위해 노력하고 있었다. caniuse.com/#search=lookbehind
Emissary

1
@Emissary 팁 주셔서 감사합니다. 예, 비교적 오래된 버전의 JavaScriptCore (JSC)를 사용하는 React Native 0.59 / Android에 있습니다. JSC에 대한 업데이트가 포함 된 React Native 0.60+로 업데이트 한 후 다시 시도하겠습니다.
Joshua Pinter

10

멋진 jQuery 번호 플러그인이 있습니다 : https://github.com/teamdf/jquery-number

10 진수 및 10 진수 및 천 단위 구분 문자 옵션을 사용하여 원하는 형식으로 숫자를 변경할 수 있습니다.

$.number(12345.4556, 2);          // -> 12,345.46
$.number(12345.4556, 3, ',', ' ') // -> 12 345,456

위와 같은 옵션을 사용하여 입력 필드 내에서 직접 사용할 수 있습니다.

$("input").number(true, 2);

또는 선택기를 사용하여 전체 DOM 요소 집합에 적용 할 수 있습니다.

$('span.number').number(true, 2);

최고의 솔루션 imho
Michal

저는 그렇게 생각하지 않습니다. 거의 800 줄의 새 파일 요구 사항을 추가하는 것은 마치 granade로 개미를 죽이는 것과 같습니다
Emiliano

6

나는 이것을 사용한다 :

function numberWithCommas(number) {
    return number.toString().replace(/\B(?=(\d{3})+(?!\d))/g, ",");
}

출처 : 링크


'123452343267.0505'.replace(/\B(?=(\d{3})+(?!\d))/g, ","); "123,452,343,267.0,505"-소수점 뒤의 마지막 쉼표에 주목하십시오.
hippietrail

5
// thousand separates a digit-only string using commas
// by element:  onkeyup = "ThousandSeparate(this)"
// by ID:       onkeyup = "ThousandSeparate('txt1','lbl1')"
function ThousandSeparate()
{
    if (arguments.length == 1)
    {
        var V = arguments[0].value;
        V = V.replace(/,/g,'');
        var R = new RegExp('(-?[0-9]+)([0-9]{3})'); 
        while(R.test(V))
        {
            V = V.replace(R, '$1,$2');
        }
        arguments[0].value = V;
    }
    else  if ( arguments.length == 2)
    {
        var V = document.getElementById(arguments[0]).value;
        var R = new RegExp('(-?[0-9]+)([0-9]{3})'); 
        while(R.test(V))
        {
            V = V.replace(R, '$1,$2');
        }
        document.getElementById(arguments[1]).innerHTML = V;
    }
    else return false;
}   


3

자바 스크립트를 사용할 수 있습니다. 아래는 코드입니다. accept숫자와 하나만dot

여기 자바 스크립트입니다

<script >

            function FormatCurrency(ctrl) {
                //Check if arrow keys are pressed - we want to allow navigation around textbox using arrow keys
                if (event.keyCode == 37 || event.keyCode == 38 || event.keyCode == 39 || event.keyCode == 40) {
                    return;
                }

                var val = ctrl.value;

                val = val.replace(/,/g, "")
                ctrl.value = "";
                val += '';
                x = val.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');
                }

                ctrl.value = x1 + x2;
            }

            function CheckNumeric() {
                return event.keyCode >= 48 && event.keyCode <= 57 || event.keyCode == 46;
            }

  </script>

HTML

<input type="text" onkeypress="return CheckNumeric()" onkeyup="FormatCurrency(this)" />

데모 JSFIDDLE



2
number = 123456.7089;
result = parseInt( number ).toLocaleString() + "<br>";
result = number.toLocaleString( 'pt-BR' ) + "<br>";

var el = document.getElementById( 'result' );
el.innerHTML = result;
<div id="result"></div>

6
op 및 다른 사람들이이 코드가 실제로 문제를 어떻게 해결하는지 이해할 수 있도록 설명을 추가해 주시겠습니까? 감사합니다
대한 Punit Gajjar

1000, 9999 beteen nomber으로 시도
에밀리

1

당신이해야 할 일은 정말로 다음과 같습니다.

123000.9123.toLocaleString()
//result will be "123,000.912"

불행히도 플랫폼에 따라 다릅니다. 일부는 toLocaleString()쉼표를 추가하지 않거나 표준의 다른 기능이 부족합니다. toLocaleString존재 여부 를 확인하는 것은 쉽지만 준수 여부는 확인하지 않습니다.
hippietrail

1000에서 9999 사이의 숫자로 시도
Emiliano 19

0

반응을위한 솔루션 조합

  let converter = Intl.NumberFormat();
  let salary =  monthlySalary.replace(/,/g,'')
  console.log(converter.format(salary))

  this.setState({
    monthlySalary: converter.format(salary)
  })
}

handleOnChangeMonthlySalary(1000)```

0

ngx-format-field를 사용할 수 있습니다. 보기에 표시 될 입력 값을 형식화하는 지시문입니다. 백엔드에 저장 될 입력 값을 조작하지 않습니다. 여기 링크 참조 !

예:

component.html:

<input type="text" formControlName="currency" [appFormatFields]="CURRENCY"
(change)="onChangeCurrency()">

component.ts

onChangeCurrency() {
this.currency.patchValue(this.currency.value);
}

데모를 보려면 여기 !


0

다음 기능을 사용할 수 있습니다.

function format(number, decimals = 2, decimalSeparator = '.', thousandsSeparator = ',') {
  const roundedNumber = number.toFixed(decimals);
  let integerPart = '',
    fractionalPart = '';
  if (decimals == 0) {
    integerPart = roundedNumber;
    decimalSeparator = '';
  } else {
    let numberParts = roundedNumber.split('.');
    integerPart = numberParts[0];
    fractionalPart = numberParts[1];
  }
  integerPart = integerPart.replace(/(\d)(?=(\d{3})+(?!\d))/g, `$1${thousandsSeparator}`);
  return `${integerPart}${decimalSeparator}${fractionalPart}`;
}

// Use Example

let min = 1556454.0001;
let max = 15556982.9999;

console.time('number format');
for (let i = 0; i < 15; i++) {
  let randomNumber = Math.random() * (max - min) + min;
  let formated = format(randomNumber, 4, ',', '.'); // formated number

  console.log('number: ', randomNumber, '; formated: ', formated);
}
console.timeEnd('number format');


너무 헷갈 리게 만들지 마세요. toLocaleString ()을 사용하십시오. developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/…
Sajad Saderi

@sajadsaderi 나는 toLocaleString () 친구도 사용하지만이 함수는 나에게 많은 유연성을 제공하지 않으므로 지역 약어를 다룰 필요가 없으며이 함수의 정의가 number_format과 동일하기 때문에 다른 사람이 사용할 수 있습니다. () PHP의 기능.
jin_maxtor

-1

나는 여기에 어떤 대답도 마음에 들지 않았기 때문에 나를 위해 일하는 기능을 만들었습니다. 다른 사람이 유용하다고 생각하는 경우 공유하고 싶습니다.

function getFormattedCurrency(num) {
    num = num.toFixed(2)
    var cents = (num - Math.floor(num)).toFixed(2);
    return Math.floor(num).toLocaleString() + '.' + cents.split('.')[1];
}
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.