>

JavaScript를 사용하여 웹 페이지에 서식이 지정된 숫자를 표시해야합니다. 올바른 위치에 쉼표가 있도록 형식을 지정하고 싶습니다. 정규식으로 어떻게 이것을 할 수 있습니까? 나는 다음과 같은 것을 얻었습니다.

myString = myString.replace(/^(\d{3})*$/g, "${1},");

... 그리고 이것이 내가 생각하는 것보다 더 복잡하다는 것을 깨달았습니다. 몇 가지 검색을 수행했으며 이에 적합한 것을 찾는 데 어려움을 겪고 있습니다.

기본적으로 다음 결과를 원합니다 :

  • 45는 45가됩니다
  • 3856은 3,856이됩니다
  • 398868483992는 398,868,483,992가됩니다

... 아이디어를 얻습니다.


  • 답변 # 1

    이 작업은 단일 정규식으로 수행 할 수 있으며 반복 할 필요가 없습니다. 브라우저가 ECMAScript 2018을 지원하는 경우 간단히 둘러보기를 사용하여 올바른 위치에 쉼표를 삽입하면됩니다.

    (?<=\d)(?=(\d\d\d)+(?!\d)) 검색   , 로 모두 대체

    이전 버전에서는 JavaScript가 lookbehind를 지원하지 않으므로 작동하지 않습니다. 다행히도 약간만 변경하면됩니다 :

    (\d)(?=(\d\d\d)+(?!\d)) 검색   \1, 로 모두 대체

    자바 스크립트에서 다음과 같이 보입니다 :

    result = subject.replace(/(\d)(?=(\d\d\d)+(?!\d))/g, "$1,");
    
    

    설명 : 문자열의 현재 위치부터 3의 배수로 숫자를 일치시킬 수 있으며 현재 위치의 왼쪽에 숫자가 있다고 주장합니다.

    도트의 오른쪽에 너무 많은 숫자가없는 한 소수점 이하 자릿수 (123456.78)로도 작동합니다 (그렇지 않으면 123,456.789,012를 얻습니다).

    다음과 같이 Number 프로토 타입에서 정의 할 수도 있습니다.

    Number.prototype.format = function(){
       return this.toString().replace(/(\d)(?=(\d{3})+(?!\d))/g, "$1,");
    };
    
    

    그리고 다음과 같이 사용하십시오 :

    var num = 1234;
    alert(num.format());
    
    
    크레딧 : Jeffrey Friedl, 정규 표현식 마스터하기, 3 위. 판, p. 66-67

  • 답변 # 2

    숫자 서식은 한 줄의 코드로 우아하게 처리 할 수 ​​있습니다.

    이 코드는 Number 객체를 확장합니다. 사용 예는 다음과 같습니다.

    코드 :

    Number.prototype.format = function () {
        return this.toString().split( /(?=(?:\d{3})+(?:\.|$))/g ).join( "," );
    };
    
    

    작동 방식

    정규 표현식은 미리보기를 사용하여 문자열 내에서 소수점 이하 또는 문자열 끝이 나타날 때까지 오른쪽에서 유일한 것이 세 개 이상의 숫자 그룹 인 위치를 찾습니다. 와이즈 비즈  해당 지점의 문자열을 배열 요소로 나눈 다음 .split()  이러한 요소를 쉼표로 구분하여 문자열로 다시 병합합니다.

    문자를 제거하지 않고 문자열을 나누려면 실제 문자와 일치하지 않고 문자열 내에서위치를 찾는 개념이 중요합니다.

    사용 예 :

    .join()
    
    
    물론 로케일 고려 사항을 처리하기 위해 코드를 쉽게 확장하거나 변경할 수 있습니다. 예를 들어 다음은 로케일 설정을 자동으로 감지하고 쉼표와 마침표 사용을 바꾸는 새 버전의 코드입니다.

    로캘 인식 버전 :

    var n = 9817236578964235;
    alert( n.format() );    // Displays "9,817,236,578,964,235"
    n = 87345.87;
    alert( n.format() );    // Displays "87,345.87"
    
    

    필요한 경우가 아니라면 첫 번째 버전의 단순함을 선호합니다.

  • 답변 # 3

    // 소수를 고려할 수도 있습니다

    Number.prototype.format = function () {
        if ((1.1).toLocaleString().indexOf(".") >= 0) {
            return this.toString().split( /(?=(?:\d{3})+(?:\.|$))/g ).join( "," );
        }
        else {
            return this.toString().split( /(?=(?:\d{3})+(?:,|$))/g ).join( "." );
        }
    };
    
    

    var n = 10000000000.34;

    n.commas () = 반환 값 : (String) 10,000,000,000.34

  • 답변 # 4

    정규식을 원한다면 while 루프에서 두 개를 사용할 수 있습니다 :

    Number.prototype.commas= function(){
     var s= '', temp, 
     num= this.toString().split('.'), n=num[0];
     while(n.length> 3){
      temp= n.substring(n.length-3);
      s= ','+temp+s;
      n= n.slice(0, -3);
     }
     if(n) s= n+s;
     if(num[1]) s+='.'+num[1];
     return s;
    }
    
    

    그리고 화려하고 싶다면 소수점으로도 숫자를 지정할 수 있습니다 :

    while(num.match(/\d{4}/)) {
        num = num.replace(/(\d{3})(,\d|$)/, ',$1$2');
    }
    
    

    수정 :

    2 개의 정규 표현식으로 루프, 분할, 조인 등을 사용하지 않고도이 작업을 수행 할 수 있습니다.

    while(num.match(/\d{4}(\,|\.)/)) {
        num = num.replace(/(\d{3})(,\d|$|\.)/, ',$1$2');
    }
    
    

    남은 자릿수가 3으로 나눌 수있는 경우 첫 번째 정규 표현식은 첫 번째 1 또는 2 자리 뒤에 쉼표를 넣습니다. 두 번째 정규 표현식은 나머지 3 자리 그룹마다 쉼표를 표시합니다.

    이것은 소수로는 작동하지 않지만 양의 정수와 음의 정수에는 효과적입니다.

    테스트 출력 :

    num = num.replace(/(\d{1,2}?)((\d{3})+)$/, "$1,$2");
    num = num.replace(/(\d{3})(?=\d)/g, "$1,");
    
    

  • 답변 # 5

    누군가 Javascript RegExp에서는 룩 백이 불가능하다고 언급했습니다. 다음은 둘러보기 사용법 (lookahead and lookbehind)을 설명하는 훌륭한 페이지입니다.

    http://www.regular-expressions.info/lookaround.html

    45 3,856 398,868,483,992 635 12,358,717,859,918,856 -1,388,488,184

관련 자료

  • 이전 c++ - Clang이 창에서 작동하도록하기
  • 다음 ios - dispatch_sync가 @synchronized에 비해 어떤 장점이 있습니까?