>

JavaScript에서 숫자를 형식화하는 데 문제가 있습니다. 웹의 다양한 소스에서 몇 가지 기능을 빌 렸습니다. 각각 하나의 인스턴스를 제외하고는 잘 작동합니다. 오류 발생시 실행 코드는 다음과 같습니다.

lth=appl.length+3;
var table = $("#unitsCompleted")[0];
var sum=0;
for(i=0; i<temp.length; i++){
    sum += Number(table.rows[lth].cells[i+1].innerHTML);
}
var t=formatNumber(sum);            
$("#mtf_retail").html("$ "+t);

동일한 코드가 다른 두 곳에서 사용됩니다. 실제로는 단순히 복사되었습니다. 아래는 서식 기능입니다.

function formatNumber(num) {
    return num.toString().replace(/(\d)(?=(\d{3})+(?!\d))/g, '$1,')
}

총 1787.78을 제외하고는 잘 작동합니다. 이미지에서 전체 1,249.69의 형식을 완벽하게 지정했음을 알 수 있습니다.

  • 답변 # 1

    그만큼 g 정규 표현식의 플래그는 정규 표현식 엔진에 패턴을 여러 번 일치시키고 모든 인스턴스를 교체하도록 지시합니다. 숫자가 1787.78이 아니라 1787.7800000000002이므로 패턴은 3 개의 연속 숫자 앞에있는 모든 숫자 다음에 일치하며 쉼표가 그 뒤에옵니다.

    이것을 피하지만 여전히 긴 숫자에서 정규 표현식이 여러 번 일치하도록하려면 두 가지 방법이 있습니다.

    정규 표현식을 조정하여 이전에 마침표와 아무것도 일치하지 않도록하십시오 (그러나 이것에는 lookbehinds가 필요하기 때문에 다소 비싸고 추악하므로 권장하지 않습니다)

    소수점 이하 두 자리로 반올림

    이것은 작동해야합니다 :

    function formatNumber(num) {
        return num.toFixed(2).toString().replace(/(\d)(?=(\d{3})+(?!\d))/g, '$1,')
    }
    
    

  • 답변 # 2

    플로트 번호의 내부 표현으로 인해 알려진 문제입니다. 콘솔에서 시도해 볼 수 있습니다

    console.log(0.1 + 0.2)
    
    

    그리고 이것이 0.3이 아니라 0.30000000000000004인지 확인하십시오. 당신은 변화를 시도 할 수 있습니다 num.toString()num.toFixed(2) Lennholm이 쓴 것처럼. 그러나 이것은 훨씬 더 큰 문제를 숨길 수 있습니다. 0.3 달러의 사용자가 있고 10 센트로 3 개의 품목을 사고 싶어한다고 상상해보십시오. 코드 검사는 사용자 0.1 * 3 = 0.30000000000000004로 돌아갑니다. 그리고 돈이 부족해서 물건을 살 수 없다는 메시지를 보게 될 것입니다. 더 나은 솔루션은 돈을 정수-센트로 저장하는 것입니다.

  • 이전 python - 두 행 사이에 얼마나 많은 시간이 지 났는지 (datatime) 확인
  • 다음 SQL Snowflake에서 시작 및 종료 날짜 확장