Javascript parse float가 내 쉼표 뒤의 소수를 무시합니다.


81

다음은 간단한 시나리오입니다. 내 사이트에 표시되는 두 값의 빼기를 표시하고 싶습니다.

//Value on my websites HTML is: "75,00"
var fullcost = parseFloat($("#fullcost").text()); 

//Value on my websites HTML is: "0,03"
var auctioncost = parseFloat($("#auctioncost").text());

alert(fullcost); //Outputs: 75
alert(auctioncost); //Ouputs: 0

아무도 내가 뭘 잘못하고 있는지 말해 줄 수 있습니까?

답변:


159

이것은 "설계에 의한"입니다. 이 parseFloat함수는 in이 비 +,-, 숫자, 지수 또는 소수점에 도달 할 때까지 문자열의 일부만 고려합니다. 일단 쉼표가 보이면 검색을 중지하고 "75"부분 만 고려합니다.

이를 수정하려면 쉼표를 소수점으로 변환하십시오.

var fullcost = parseFloat($("#fullcost").text().replace(',', '.'));

9
모든 지역에서 작동합니까? OS의 지역 설정에 따라 쉼표를 사용하지 않습니까?
Dusan Plavak 2015 년

14
위의 코드는 첫 번째 ','만 제거합니다. 숫자가 700,000,000이면 어떻게 되나요? 당신이 필요합니다 .replace을 (/, / g, '')
hyankov

17
나는 대부분의 사람들이 쉼표를 소수 구분 기호뿐만 아니라 천 단위 구분 기호로도 사용할 수 있다는 것을 잊고 있다고 생각합니다.
Peter Raeves

3
안녕하세요, 입력이 5.200,755 천이 백과 칠십 오를 의미 한다면 어떨까요?
hasan05

이 답변은 현재 시나리오에서만 작동하며, 예를 들어 숫자가 15,000이면 15가 표시되며 이는 잘못된 것입니다!
itsHarshad

31

자바 스크립트의 parseFloat는 로케일 매개 변수를 사용하지 않습니다. 당신은 대체해야합니다 그래서 ,함께.

parseFloat('0,04'.replace(/,/, '.')); // 0.04

19
숫자가 7,000,000.15이면 어떻게 되나요?
Peter Raeves

7
구문 분석을 시도 할 때 문자열을 플로트처럼 보이도록 조정해야합니다. 로케일이 소수점에 마침표를 사용하는 경우 부동 소수점으로 구문 분석하기 전에 모든 쉼표 (수천 구분 기호)를 안전하게 제거 할 수 있습니다. 로케일에서 소수점 대신 마침표를 사용하는 경우 마침표 (천 단위 구분 기호)를 안전하게 제거한 다음 쉼표 (소수점)를 마침표로 변경할 수 있습니다.
Ultroman the Tacoman



12

@JaredPar는에서 지적 그의 대답의 사용을 parseFloat대체와

var fullcost = parseFloat($("#fullcost").text().replace(',', '.'));

를 유언장으로 바꾸는 것만 comma으로 dot도 문제가 해결 됩니다. 이런 식으로 수천 개 이상의 숫자가 아니라면1.000.000,00 잘못된 숫자를 제공합니다. 그래서 당신은 교체해야 comma제거합니다을 dots.

// Remove all dot's. Replace the comma.
var fullcost = parseFloat($("#fullcost").text().replace(/\./g,'').replace(',', '.'));

두 개의 교체를 사용하면 출력에서 ​​잘못된 숫자를받지 않고 데이터를 처리 할 수 ​​있습니다.


8

백만 1,234,567의 경우 모든 쉼표를 바꾸려면이 구문을 사용하는 것이 좋습니다.

var string = "1,234,567";
string = string.replace(/[^\d\.\-]/g, ""); 
var number = parseFloat(string);
console.log(number)

g모든 쉼표를 제거 하는 수단입니다.

여기 에서 Jsfiddle 데모를 확인 하십시오 .


7

JS의 숫자는 .(마침표 / 마침표) 문자를 사용하여 ,쉼표가 아닌 소수점을 나타냅니다 .


1

쉼표 ( ,) 및 마침표 ( ) .가 관련 될 수 있지만 정확한 숫자 형식을 알 수없는 이 문제를 처리하는 방법을 궁금해하는 사람을 위해 -이것은 사용하기 전에 문자열을 수정하는 방법입니다 parseFloat()(다른 답변에서 아이디어를 빌림).

function preformatFloat(float){
   if(!float){
      return '';
   };

   //Index of first comma
   const posC = float.indexOf(',');

   if(posC === -1){
      //No commas found, treat as float
      return float;
   };

   //Index of first full stop
   const posFS = float.indexOf('.');

   if(posFS === -1){
      //Uses commas and not full stops - swap them (e.g. 1,23 --> 1.23)
      return float.replace(/\,/g, '.');
   };

   //Uses both commas and full stops - ensure correct order and remove 1000s separators
   return ((posC < posFS) ? (float.replace(/\,/g,'')) : (float.replace(/\./g,'').replace(',', '.')));
};
// <-- parseFloat(preformatFloat('5.200,75'))
// --> 5200.75

적어도 이것은 영국 / 미국 및 유럽 십진수 형식의 구문 분석을 허용합니다 (문자열에 유효한 숫자가 포함되어 있다고 가정).


그것은 형식 모두 잘 작동 1,234.56하고1.234,56
joseantgv

0

제 경우에는 이미 마침표 (.)와 쉼표 (,)가 있었으므로 저에게 효과가 있었던 것은 아래와 같이 빈 문자열이 replace있는 쉼표 였습니다 (,).

parseFloat('3,000.78'.replace(',', '')) 

이는 기존 데이터베이스의 금액이 3,000.78이라고 가정합니다. 결과는 다음과 같습니다 . 3000.78첫 번째 쉼표없이 (,).


-1

내 출신 국가의 통화 형식은 "3.050,89 €"입니다.

parseFloat는 점을 소수점 구분 기호로 식별하여 다음과 같이 2 개의 값을 추가 할 수 있습니다.

parseFloat(element.toString().replace(/\./g,'').replace(',', '.'))
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.