2011-09-15 22 views
34

Một yếu tố đầu vào có chứa số một nơi dấu phẩy hoặc dấu chấm được sử dụng như phân cách thập phân và không gian có thể được sử dụng cho hàng ngàn nhóm như thế này:Chuyển đổi String với Dot hoặc Comma phân số thập phân đến số trong JavaScript

'1 2'
'110 000,23'
'100 1,23'

Làm thế nào người ta sẽ chuyển đổi chúng sang một số float trong trình duyệt sử dụng JavaScript?

Giao diện người dùng jQuery và jQuery được sử dụng. Number(string) trả lại NaNparseFloat() dừng trên không gian hoặc dấu phẩy đầu tiên.

Trả lời

43

Đừng một thay thế đầu tiên:

parseFloat(str.replace(',','.').replace(' ','')) 
+27

Điều này hoàn toàn bỏ qua thực tế là ',' thường được sử dụng làm dấu tách hàng nghìn (nhóm). Nếu bạn sử dụng điều này trên một số như '1.000.000.00' bạn nhận được '1', điều này rõ ràng là hoàn toàn sai. – Thor84no

+0

@ Thor84no Bạn cho rằng mã của mình sẽ chạy trong văn hóa EN, nhưng nếu dữ liệu sẽ được nhập từ những người sử dụng tiếng Pháp, Đan Mạch, Phần Lan, Séc, vv, sẽ không có sự nhầm lẫn. Tất cả phụ thuộc vào việc sử dụng mã số – Zbynek

+9

@Zbynek Tôi không cho rằng điều đó. Hầu hết nếu không phải tất cả các ngôn ngữ/khu vực đều sử dụng nhóm chữ số của một số mô tả. Ký tự được sử dụng thay đổi (ví dụ: '[., ']'). Tôi chỉ ra một thực tế rằng mã này là bỏ qua một số lượng lớn các yếu tố đầu vào sẽ làm cho nó không chính xác mà không có cảnh báo trong câu trả lời (và không có cách nào để biết nó đã xảy ra). Ngay cả khi các ngôn ngữ bạn liệt kê sẽ không có vấn đề này mà không phủ nhận thực tế rằng trong * nhiều * * nhiều * ngôn ngữ nó sẽ có vấn đề đó. Lưu ý rằng nó sẽ bị chia đều nếu ngôn ngữ được đề cập sử dụng '.' làm ký tự nhóm chữ số của nó. – Thor84no

8

Bạn có thể thay thế tất cả các không gian bằng một chuỗi rỗng, tất cả hôn mê bởi dấu chấm và sau đó phân tích nó.

var str = "110 000,23"; 
var num = parseFloat(str.replace(/\s/g, "").replace(",", ".")); 
console.log(num); 

Tôi đã sử dụng regex ở đầu tiên để có thể đối sánh với tất cả các không gian, không chỉ là dấu cách đầu tiên.

14

Các giải pháp hoàn hảo

accounting.js là một thư viện JavaScript nhỏ cho số, tiền bạc và định dạng tiền tệ.

Check this for ref

+0

Cảm ơn bạn. Điều này không cung cấp một tùy chọn để kiểm tra định dạng không đúng khi thực hiện unformat, nhưng nó là một thư viện cơ sở tốt để xây dựng chức năng đó trên đầu trang. Ví dụ về kết quả mơ hồ: http://jsfiddle.net/SkzYe/ –

+0

Để tham khảo sau này, thư viện này đã chuyển sang http://openexchangerates.github.io/accounting.js/ – Thor84no

7

Tôi nhận ra tôi là muộn để đảng, nhưng tôi muốn có một giải pháp cho điều này mà xử lý đúng chữ số nhóm cũng như dải phân cách thập phân khác nhau cho loại tiền tệ. Như không ai trong số những trường hợp sử dụng của tôi bao phủ hoàn toàn, tôi đã viết giải pháp của riêng tôi mà có thể hữu ích cho người khác:

function parsePotentiallyGroupedFloat(stringValue) { 
    stringValue = stringValue.trim(); 
    var result = stringValue.replace(/[^0-9]/g, ''); 
    if (/[,\.]\d{2}$/.test(stringValue)) { 
     result = result.replace(/(\d{2})$/, '.$1'); 
    } 
    return parseFloat(result); 
} 

này nên loại bỏ bất kỳ phi chữ số và sau đó kiểm tra xem đã có một dấu thập phân (hoặc dấu phẩy) tiếp bằng hai chữ số và chèn dấu thập phân nếu cần.

Điều đáng chú ý là tôi nhắm mục tiêu cụ thể cho đơn vị tiền tệ và vì vậy nó giả định không có chữ số thập phân hoặc chính xác hai. Thật khó để chắc chắn về việc điểm thập phân đầu tiên có thể gặp phải là dấu thập phân hay ký tự nhóm chữ số (ví dụ: 1.542 có thể là 1542) trừ khi bạn biết chi tiết cụ thể của ngôn ngữ hiện tại, nhưng phải dễ dàng điều chỉnh đối với trường hợp sử dụng cụ thể của bạn bằng cách thay đổi \d{2}$ thành nội dung phù hợp với nội dung bạn mong đợi sau dấu thập phân.

-1

Từ số chuỗi tiền tệ là dễ dàng thông qua Number.prototype.toLocaleString. Tuy nhiên, ngược lại có vẻ là một vấn đề phổ biến. Có thể không thu được dấu tách hàng nghìn và dấu thập phân trong tiêu chuẩn JS.

Trong câu hỏi cụ thể này, dấu tách hàng nghìn là khoảng trắng " " nhưng trong nhiều trường hợp, nó có thể là dấu chấm "." và dấu thập phân có thể là dấu phẩy ",".Chẳng hạn như trong 1 000 000,00 hoặc 1.000.000,00. Sau đó, đây là cách tôi chuyển đổi nó thành một số dấu chấm động thích hợp.

var price = "1 000.000,99", 
 
    value = +price.replace(/(\.|\s)|(\,)/g,(m,p1,p2) => p1 ? "" : "."); 
 
console.log(value);

Vì vậy, các callback replacer mất "1.000.000,00" và chuyển nó thành "1000000.00". Sau đó + ở phía trước của chuỗi kết quả ép buộc nó thành một số.

Chức năng này thực sự khá tiện dụng. Ví dụ nếu bạn thay thế phần p1 = "" với p1 = "," trong hàm callback, một đầu vào của 1.000.000,00 sẽ cho kết quả 1,000,000.00

+0

Cả hai "1 000 000,99" và '" 1 000 000.99 "' kết quả trong 'NaN'. Cú pháp của bạn cũng loại obfuscates rằng 'p1 =' và 'p2 =' thực sự không làm gì cả. Các giá trị được gán cho chúng được trả về vì nó là một hàm mũi tên câu lệnh duy nhất, nhưng nhiệm vụ là hoàn toàn không cần thiết và chỉ làm cho nó khó đọc hơn. – Thor84no

+0

@ Thor84no Cảm ơn bạn đã đứng đầu. – Redu

5

gì về:

parseFloat(str.replace(' ', '').replace('.', '').replace(',', '.')); 
1

Tất cả các giải pháp khác yêu cầu bạn phải biết định dạng trước. Tôi cần phát hiện (!) Định dạng trong mọi trường hợp và đây là những gì tôi kết thúc.

function detectFloat(source) { 
    let float = accounting.unformat(source); 
    let posComma = source.indexOf(','); 
    if (posComma > -1) { 
     let posDot = source.indexOf('.'); 
     if (posDot > -1 && posComma > posDot) { 
      let germanFloat = accounting.unformat(source, ','); 
      if (Math.abs(germanFloat) > Math.abs(float)) { 
       float = germanFloat; 
      } 
     } else { 
      // source = source.replace(/,/g, '.'); 
      float = accounting.unformat(source, ','); 
     } 
    } 
    return float; 
} 

này đã được thử nghiệm với các trường hợp sau:

 const cases = { 
      "0": 0, 
      "10.12": 10.12, 
      "222.20": 222.20, 
      "-222.20": -222.20, 
      "+222,20": 222.20, 
      "-222,20": -222.20, 
      "-2.222,20": -2222.20, 
      "-11.111,20": -11111.20, 
     }; 

Gợi ý hoan nghênh.