Javascript phân tích cú pháp float đang bỏ qua các số thập phân sau dấu phẩy của tôi


81

Đây là một tình huống đơn giản. Tôi muốn hiển thị phép trừ hai giá trị hiển thị trên trang web của mình:

//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

Bất cứ ai có thể cho tôi biết tôi đang làm gì sai?

Câu trả lời:


158

Đây là "Theo thiết kế". Các parseFloatchức năng sẽ chỉ xem xét các bộ phận của chuỗi lên cho đến khi trong đạt một tổ chức phi +, -, số, số mũ hoặc thập phân điểm. Khi nó nhìn thấy dấu phẩy, nó sẽ ngừng tìm kiếm và chỉ xem xét phần "75".

Để khắc phục điều này, hãy chuyển đổi dấu phẩy thành dấu thập phân.

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

9
Điều này sẽ hoạt động ở tất cả các khu vực? Không sử dụng dấu phẩy tùy thuộc vào cài đặt khu vực của bạn trong hệ điều hành?
Dusan Plavak

14
Đoạn mã trên sẽ chỉ xóa ',' đầu tiên. Nếu con số là 700.000.000 thì sao? Bạn cần: .replace (/, / g, '')
hyankov

17
Tôi nghĩ rằng hầu hết mọi người đang quên rằng dấu phẩy cũng có thể được sử dụng như một dấu phân cách hàng nghìn chứ không chỉ là dấu phân tách thập phân.
Peter Raeves

3
Xin chào bạn, điều gì sẽ xảy ra nếu đầu vào là 5.200,75năm nghìn hai trăm bảy mươi lăm.
hasan05

Câu trả lời này sẽ chỉ hoạt động trong kịch bản hiện tại, và nếu ví dụ, nếu con số là 15.000 thì nó sẽ hiển thị 15, điều này không chính xác!
itsHarshad

31

parseFloat của javascript không nhận tham số ngôn ngữ. Vì vậy, bạn sẽ phải thay thế ,bằng.

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

19
Nếu con số là 7.000.000.15 thì sao?
Peter Raeves

7
Bạn chịu trách nhiệm điều chỉnh các chuỗi của mình để trông giống như một cái phao, khi cố gắng phân tích cú pháp chúng. Nếu ngôn ngữ của bạn sử dụng dấu chấm cho dấu thập phân, thì bạn có thể tách tất cả các dấu phẩy (dấu phân cách hàng nghìn) một cách an toàn trước khi cố gắng phân tích cú pháp thành dấu phẩy. Nếu ngôn ngữ của bạn sử dụng dấu phẩy thay vì dấu chấm cho dấu thập phân, bạn có thể xóa mọi dấu chấm (dấu phân cách hàng nghìn) một cách an toàn và sau đó thay đổi dấu phẩy (dấu thập phân) thành dấu chấm.
Ultroman the Tacoman



12

Như @JaredPar đã chỉ ra trong câu trả lời của anh ấy sử dụng parseFloatthay thế

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

Chỉ cần thay thế commabằng một dotsẽ sửa chữa, Trừ khi đó là một số trên hàng nghìn như 1.000.000,00cách này sẽ cung cấp cho bạn chữ số sai. Vì vậy, bạn cần phải thay thế commaloại bỏ dots.

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

Bằng cách sử dụng hai thay thế, bạn sẽ có thể xử lý dữ liệu mà không nhận được các chữ số sai trong đầu ra.


8

Tốt hơn là sử dụng cú pháp này để thay thế tất cả các dấu phẩy trong trường hợp một triệu 1.234.567

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

Phương gtiện để loại bỏ tất cả các dấu phẩy.

Kiểm tra bản demo Jsfiddle tại đây .


7

Các số trong JS sử dụng .ký tự ,(dấu chấm / dấu chấm đầy đủ) để biểu thị dấu thập phân chứ không phải dấu (dấu phẩy).


1

Đối với bất kỳ ai đến đây tự hỏi làm thế nào để giải quyết vấn đề này trong đó dấu phẩy ( ,) và dấu chấm đầy đủ ( .) có thể liên quan nhưng định dạng số chính xác có thể không được biết - đây là cách tôi sửa một chuỗi trước khi sử dụng parseFloat()(mượn ý tưởng từ các câu trả lời khác):

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

Ít nhất, điều này sẽ cho phép phân tích cú pháp các định dạng thập phân của Anh / Mỹ và Châu Âu (giả sử chuỗi chứa một số hợp lệ).


Nó hoạt động tốt cho cả hai định dạng 1,234.561.234,56
joseantgv

0

Trong trường hợp của tôi, tôi đã có một (.)dấu chấm và cả dấu phẩy (,), vì vậy, những gì phù hợp với tôi là replacedấu phẩy (,)với một chuỗi trống như bên dưới:

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

Điều này giả định rằng số lượng từ cơ sở dữ liệu hiện có là 3.000,78. Kết quả là: 3000.78không có dấu phẩy đầu tiên (,).


-1

Từ quốc gia xuất xứ của tôi, định dạng tiền tệ giống như "3.050,89 €"

parseFloat xác định dấu chấm là dấu phân cách thập phân, để thêm 2 giá trị, chúng ta có thể đặt nó như sau:

parseFloat(element.toString().replace(/\./g,'').replace(',', '.'))
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.