Làm cách nào để chuyển đổi chuỗi thành float trong JavaScript?


Câu trả lời:


371

Nếu chúng có nghĩa là các giá trị riêng biệt, hãy thử điều này:

var values = "554,20".split(",")
var v1 = parseFloat(values[0])
var v2 = parseFloat(values[1])

Nếu chúng có nghĩa là một giá trị duy nhất (như trong tiếng Pháp, trong đó một nửa được viết 0,5)

var value = parseFloat("554,20".replace(",", "."));

6
Điều gì về nơi bạn có một dấu phẩy được sử dụng như một nghìn ngăn cách? Ví dụ: 1234 được viết là 1,234
Chris B

6
Bạn chỉ có thể xóa dấu phẩy, sau đó phân tích nó. (ví dụ: thay thế nó bằng "")
Jesse Rusak

7
nó không an toàn lắm, vì sconto = parseFloat ("5, 5" .replace (",", ".")); trả về 5 số dẫn đầu để tin rằng đó là số hợp lệ, nhưng bạn mất phần 0,5 hoặc bạn có thể coi đó không phải là số hợp lệ
max4ever

1
@ max4ever Nếu bạn lo lắng về việc âm thầm chấp nhận các số không hợp lệ, bạn có thể sử dụng +(string)thay vì parseString(string)như được đề xuất bởi @Stev bên dưới. Vì vậy, ví dụ đầu tiên sẽ là v1 = +(values[0]); v2 = +(values[1]);.
Jesse Rusak

1
FAIL, nếu số của tôi là gì 6.000.000. Chức năng chỉ thay thế phân tách dấu phẩy đầu tiên
GusDeCooL

55

Bạn đã bao giờ thử làm điều này? : p

var str = '3.8';ie
alert( +(str) + 0.2 );

+ (chuỗi) sẽ đúc chuỗi thành float.

Tiện dụng!

Vì vậy, để giải quyết vấn đề của bạn, bạn có thể làm một cái gì đó như thế này:

var floatValue = +(str.replace(/,/,'.'));

7
Tôi thực sự thích +(str)giải pháp - parseFloatbỏ qua các ký tự không hợp lệ sau số, +(str)trả về NaNtrong các trường hợp đó, đó chính xác là những gì tôi cần.
Alex

34

Thay thế dấu phẩy bằng dấu chấm.

Điều này sẽ chỉ trả lại 554:

var value = parseFloat("554,20")

Điều này sẽ trả về 554.20:

var value = parseFloat("554.20")

Vì vậy, cuối cùng, bạn chỉ cần sử dụng:

var fValue = parseFloat(document.getElementById("textfield").value.replace(",","."))

Đừng quên rằng parseInt()chỉ nên được sử dụng để phân tích số nguyên (không có dấu phẩy động). Trong trường hợp của bạn, nó sẽ chỉ trả về 554. Ngoài ra, việc gọi parseInt () trên một số float sẽ không làm tròn số: nó sẽ lấy sàn của nó (số nguyên thấp nhất gần nhất).


Ví dụ mở rộng để trả lời câu hỏi của Pedro Ferreira từ các bình luận:

Nếu trường văn bản chứa hàng ngàn dấu phân cách như trong 1.234.567,99đó có thể được loại bỏ trước với một dấu chấm khác replace:

var fValue = parseFloat(document.getElementById("textfield").value.replace(/\./g,"").replace(",","."))

Vậy còn "." ngàn phân cách? Giống như 4.554,20, cái gì sẽ trở lại ...?
Pedro Ferreira

16

Nếu bạn mở rộng đối tượng String như thế này ..

String.prototype.float = function() { 
  return parseFloat(this.replace(',', '.')); 
}

.. bạn có thể chạy nó như thế này

"554,20".float()
> 554.20

cũng hoạt động với dấu chấm

"554.20".float()
> 554.20

typeof "554,20".float()
> "number"

10
Mặc dù thông thường, nó được coi là hình thức xấu để sửa đổi các nguyên mẫu đối tượng cơ sở. Điều gì xảy ra nếu một khung công tác khác cũng cố gắng làm điều đó nhưng chức năng khác nhau?
phreakhead

3

@GusDeCool hoặc bất kỳ ai khác đang cố gắng thay thế hơn một nghìn dấu phân cách, một cách để làm điều đó là thay thế toàn cầu regex : /foo/g. Chỉ cần nhớ rằng đó .là một metacharacter, vì vậy bạn phải thoát nó hoặc đặt nó trong ngoặc ( \.hoặc [.]). Đây là một lựa chọn:

var str = '6.000.000';
str.replace(/[.]/g,",");

1
vâng, một sự thay thế không có regex chỉ thay thế một lần xuất hiện của nhân vật.
Aukhan 18/03/2016

2

Bạn có thể sử dụng chức năng này. Nó sẽ thay thế dấu phẩy bằng '' và sau đó nó sẽ phân tích giá trị và sau đó nó sẽ điều chỉnh lại dấu phẩy theo giá trị.

function convertToFloat(val) {
        if (val != '') {
            if (val.indexOf(',') !== -1)
                val.replace(',', '');
            val = parseFloat(val);
            while (/(\d+)(\d{3})/.test(val.toString())) {
                val = val.toString().replace(/(\d+)(\d{3})/, '$1' + ',' + '$2');
            }
        }
        return val;
    }

0

Tôi đã có cùng một vấn đề ngoại trừ tôi không biết trước hàng ngàn dấu phân cách và dấu phân cách thập phân là gì. Tôi đã kết thúc việc viết một thư viện để làm điều này. Nếu bạn quan tâm thì đây là: https://github.com/GuillaumeLeclerc/number-parsing


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.