숫자에서 후미의 0을 제거하는 표준 API 호출을 놓쳤습니까?
전의.
var x = 1.234000 // to become 1.234;
var y = 1.234001; // stays 1.234001
Number.toFixed () 및 Number.toPrecision ()은 내가 찾고있는 것이 아닙니다.
parseFloat(n)
?
숫자에서 후미의 0을 제거하는 표준 API 호출을 놓쳤습니까?
전의.
var x = 1.234000 // to become 1.234;
var y = 1.234001; // stays 1.234001
Number.toFixed () 및 Number.toPrecision ()은 내가 찾고있는 것이 아닙니다.
parseFloat(n)
?
답변:
문자열로 변환하면 문자열이 아닌 숫자로 작성된 이후 변수에 저장되지 않는 후행 0이 표시되지 않습니다.
var n = 1.245000
var noZeroes = n.toString() // "1.245"
var n = 1.245000000000001
(사용자에게 표현하기에 무의미하다고 가정)
필자는 .toFixed()
필요한 곳 에서 사용 하고 싶었던 비슷한 인스턴스를 가지고 있었지만 그렇지 않을 때 패딩을 원하지 않았습니다. 그래서 toFixed와 함께 parseFloat를 사용했습니다.
패딩없이 고정
parseFloat(n.toFixed(4));
거의 같은 일을하는 다른 옵션
이 답변은 결정에 도움이 될 수 있습니다
Number(n.toFixed(4));
toFixed
숫자를 특정 길이로 반올림 / 채울뿐만 아니라 문자열로 변환합니다. 다시 숫자 형식으로 변환하면 숫자를 산술적으로 사용하는 것이 더 안전 할뿐만 아니라 후행 0도 자동으로 삭제합니다. 예를 들면 다음과 같습니다.
var n = "1.234000";
n = parseFloat(n);
// n is 1.234 and in number form
후행 0으로 숫자를 정의하더라도 삭제됩니다.
var n = 1.23000;
// n == 1.23;
parseFloat(n).toFixed(4);
당신의 실제 답변 대신에 보았다 . 죄송 해요.
+(n.toFixed(4))
?
나는 먼저 matti-lyra와 gary의 답변을 조합하여 사용했습니다.
r=(+n).toFixed(4).replace(/\.0+$/,'')
결과 :
다소 문제가되는 경우는 0.10001입니다. 이 더 긴 버전을 사용하게되었습니다.
r = (+n).toFixed(4);
if (r.match(/\./)) {
r = r.replace(/\.?0+$/, '');
}
업데이트 : 이것은 Gary의 최신 버전입니다 (의견 참조).
r=(+n).toFixed(4).replace(/([0-9]+(\.[0-9]+[1-9])?)(\.?0+$)/,'$1')
위와 동일한 결과를 제공합니다.
toFixed(4).replace(/([0-9]+(\.[1-9]+)?)(\.?0+$)/,"$1")
([0-9]+(\.[0-9]+[1-9])?)(\.?0+$)
replace(/[,.][1-9]+(0+)/,'')
?
이 toFixed
방법은 필요한 경우 적절한 반올림을 수행합니다. 또한 항상 0이 아닌 후행 0을 추가합니다.
(4.55555).toFixed(2);
//-> "4.56"
(4).toFixed(2);
//-> "4.00"
반환 값을 숫자로 캐스팅하면 후행 0이 삭제됩니다. 이것은 자신의 반올림 또는 절단 수학을 수행하는 것보다 간단한 접근법입니다.
+(4.55555).toFixed(2);
//-> 4.56
+(4).toFixed(2);
//-> 4
toFixed
전화를 통해 중요했습니다 ). 이상한 UX 엣지 케이스입니다.
기본적으로 동일한 요구 사항이 있었으며이 기능에 대한 기본 제공 메커니즘이 없음을 발견했습니다.
후행 0을 다듬는 것 외에도 사용자의 현재 로캘 (예 : 123,456.789)에 대한 출력을 반올림하고 형식을 지정해야했습니다.
이것에 대한 나의 모든 작업은 GitHub에서 prettyFloat.js (MIT 라이센스)로 포함되었습니다 : https://github.com/dperish/prettyFloat.js
사용 예 :
prettyFloat(1.111001, 3) // "1.111"
prettyFloat(1.111001, 4) // "1.111"
prettyFloat(1.1111001, 5) // "1.1111"
prettyFloat(1234.5678, 2) // "1234.57"
prettyFloat(1234.5678, 2, true) // "1,234.57" (en-us)
2018 년 8 월 업데이트
모든 최신 브라우저는 이제 언어 구분 문자열 비교, 숫자 형식 및 날짜 및 시간 형식을 제공 하는 ECMAScript Internationalization API를 지원합니다 .
let formatters = {
default: new Intl.NumberFormat(),
currency: new Intl.NumberFormat('en-US', { style: 'currency', currency: 'USD', minimumFractionDigits: 0, maximumFractionDigits: 0 }),
whole: new Intl.NumberFormat('en-US', { style: 'decimal', minimumFractionDigits: 0, maximumFractionDigits: 0 }),
oneDecimal: new Intl.NumberFormat('en-US', { style: 'decimal', minimumFractionDigits: 1, maximumFractionDigits: 1 }),
twoDecimal: new Intl.NumberFormat('en-US', { style: 'decimal', minimumFractionDigits: 2, maximumFractionDigits: 2 })
};
formatters.twoDecimal.format(1234.5678); // result: "1,234.57"
formatters.currency.format(28761232.291); // result: "$28,761,232"
구형 브라우저의 경우 다음 polyfill을 사용할 수 있습니다. https://cdn.polyfill.io/v2/polyfill.min.js?features=Intl.~locale.en
이 숫자를 사용하여 부동 숫자를 최소화 할 수 있습니다
var n = 0.0000;
n = parseFloat(n.toString());
//output n = 0;
// n = 3.14000; --> n = 3.14;
순수한 정규식 답변
n.replace(/(\.[0-9]*[1-9])0+$|\.0*$/,'$1');
아무도 왜 아무도주지 않았는지 궁금합니다!
Django가 Decimal 유형 값을 텍스트 필드에 표시 할 때이 문제도 해결해야했습니다. 예를 들어 '1'이 값일 때 '1.00000000'으로 표시됩니다. '1.23'이 값이면 '1.23000000'을 표시합니다 ( 'decimal_places'설정이 8 인 경우)
parseFloat 를 사용 하는 것은 옵션이 아닙니다. 정확히 동일한 값을 반환하지 않을 수도 있기 때문입니다. toFixed 는 아무것도 반올림하지 않기 때문에 옵션이 아니므로 함수를 만들었습니다.
function removeTrailingZeros(value) {
value = value.toString();
# if not containing a dot, we do not need to do anything
if (value.indexOf('.') === -1) {
return value;
}
# as long as the last character is a 0 or a dot, remove it
while((value.slice(-1) === '0' || value.slice(-1) === '.') && value.indexOf('.') !== -1) {
value = value.substr(0, value.length - 1);
}
return value;
}
이 솔루션 중 어느 것도 매우 적은 수의 나를 위해 효과가 없었습니다. http://numeraljs.com/이 문제를 해결했습니다.
parseFloat(0.00000001.toFixed(8));
// 1e-8
numeral(0.00000001).format('0[.][00000000]');
// "0.00000001"
어떤 이유로 든 Floats를 사용할 수없고 (관련된 Floats와 같은) 이미 올바른 숫자를 나타내는 문자열에서 시작하는 경우이 솔루션이 유용 할 수 있습니다. 숫자를 나타내는 문자열을 후행 0이없는 숫자를 나타내는 문자열로 변환합니다.
function removeTrailingZeroes( strAmount ) {
// remove all trailing zeroes in the decimal part
var strDecSepCd = '.'; // decimal separator
var iDSPosition = strAmount.indexOf( strDecSepCd ); // decimal separator positions
if ( iDSPosition !== -1 ) {
var strDecPart = strAmount.substr( iDSPosition ); // including the decimal separator
var i = strDecPart.length - 1;
for ( ; i >= 0 ; i-- ) {
if ( strDecPart.charAt(i) !== '0') {
break;
}
}
if ( i=== 0 ) {
return strAmount.substring(0, iDSPosition);
} else {
// return INTPART and DS + DECPART including the rightmost significant number
return strAmount.substring(0, iDSPosition) + strDecPart.substring(0,i + 1);
}
}
return strAmount;
}
모든 답변과 의견을 읽은 후 나는 이것으로 끝났습니다.
function isFloat(n) {
let number = (Number(n) === n && n % 1 !== 0) ? eval(parseFloat(n)) : n;
return number;
}
나는 eval
어떻게 든 사용하는 것이 해로울 수 있다는 것을 알고 있지만 이것은 많은 도움이되었습니다.
그래서:
isFloat(1.234000); // = 1.234;
isFloat(1.234001); // = 1.234001
isFloat(1.2340010000); // = 1.234001
소수점 이하 자릿수를 제한하려면 toFixed()
다른 사람이 지적한대로 사용하십시오 .
let number = (Number(n) === n && n % 1 !== 0) ? eval(parseFloat(n).toFixed(3)) : n;
그게 다야.
후행 0을 제거해야하지만 0을 포함하여 최소 2 개의 소수점을 유지 하십시오.
작업중 인 숫자는 .toFixed (6)에 의해 생성 된 6 개의 십진수 문자열입니다.
예상 결과:
var numstra = 12345.000010 // should return 12345.00001
var numstrb = 12345.100000 // should return 12345.10
var numstrc = 12345.000000 // should return 12345.00
var numstrd = 12345.123000 // should return 12345.123
해결책:
var numstr = 12345.100000
while (numstr[numstr.length-1] === "0") {
numstr = numstr.slice(0, -1)
if (numstr[numstr.length-1] !== "0") {break;}
if (numstr[numstr.length-3] === ".") {break;}
}
console.log(numstr) // 12345.10
논리:
문자열 마지막 문자가 0 인 경우 루프 기능을 실행하십시오.
마지막 문자를 제거하고 문자열 변수를 업데이트하십시오.
업데이트 된 문자열 마지막 문자가 0이 아닌 경우 루프를 종료하십시오.
마지막 세 번째 문자로 업데이트 된 문자열이 부동 소수점 인 경우 루프를 종료하십시오.
1.234000 === 1.234
.