Chuyển chuỗi có dấu phẩy thành số nguyên


95

Có phương pháp nào gọn gàng để chuyển "1,112" thành số nguyên 1112, thay vì 1 không?

Tôi có một cái, nhưng không gọn gàng:

"1,112".split(',').join.to_i #=> 1112

Câu trả lời:


175

Còn cái này thì sao?

 "1,112".delete(',').to_i

Cảm ơn câu trả lời của bạn. Nó tốt hơn của tôi rất nhiều. Trong thực tế, tôi đã hy vọng sẽ có một cuộc gọi thay vì hai cuộc gọi. như: "1,112" .to_money. Sau khi xem xét các câu trả lời, có khả năng không có phương pháp nào như vậy. Dù sao, cảm ơn rất nhiều!
mCY

@michealKohi bạn có thể cho tôi biết Tại sao xóa () nhanh hơn nhiều so với làm tương tự trong gsub chấp nhận regex không, tôi luôn nghĩ cách regex nhanh hơn. Tôi đã chạy Benchmark trên cả hai về sự khác biệt rất lớn về thời gian thực hiện.
Abhinay

1
@Abhinay Về điểm chuẩn của bạn: cỡ mẫu? Kích thước chuỗi?
Michael Kohl

5

Bạn cũng có thể muốn đảm bảo rằng mã của bạn được bản địa hóa chính xác hoặc đảm bảo rằng người dùng đã quen với ký hiệu "quốc tế". Ví dụ: "1,112" thực sự có nghĩa là các số khác nhau ở các quốc gia khác nhau. Ở Đức, nó có nghĩa là số hơn một một chút, thay vì một nghìn lẻ.

Bài viết tương ứng trên Wikipedia có tại http://en.wikipedia.org/wiki/Decimal_mark . Tuy nhiên, nó có vẻ được viết kém vào thời điểm này. Ví dụ như là một người Trung Quốc, tôi không chắc những mô tả về hàng nghìn dải phân cách ở Trung Quốc này đến từ đâu.


4

Một số tiện lợi hơn

"1,1200.00".gsub(/[^0-9]/,'') 

nó làm cho "1 200 200" hoạt động bình thường


8
Thậm chí tốt hơn là '1,1200.00'.gsub(/[^0-9\.]/,'').to_f.
Hauleth

7
Chờ đã, tại sao bạn muốn chuyển đổi "1,1200.00"sang "1120000"? Bạn không chỉ muốn thay thế ,(hoặc, tùy thuộc vào ngôn ngữ, .)? Ngoài ra, điều này không chuyển đổi nó thành một số nguyên hoặc float, chỉ là một chuỗi không có dấu phân cách.
brymck

3
@Bryan: Để mạo hiểm phỏng đoán, bạn có thể muốn thực hiện điều này trong ứng dụng ngân hàng, khi chuyển đổi số tiền mà người dùng nhập vào, để chỉ xử lý các số nguyên bên trong ứng dụng: ví dụ: chuyển đổi đô la và xu sang xu . Phương pháp này sẽ tránh mọi lỗi làm tròn có thể xuất hiện bất ngờ khi xử lý các số dấu phẩy động. Khi một số tiền tệ cần được hiển thị cho người dùng, số tiền xu có thể được chuyển đổi thành đô la và xu. (Mặc dù đó không phải là những gì người hỏi hỏi về.)
Teemu Leisti

2
Câu trả lời này thậm chí không giải quyết yêu cầu của người hỏi để chuyển đổi chuỗi thành số nguyên hoặc số thực.
LS

2

Sau đây là một phương pháp khác sẽ hoạt động, mặc dù như với một số phương pháp khác, nó sẽ loại bỏ các vị trí thập phân.

a = 1,112
b = a.scan(/\d+/).join().to_i => 1112


1

Nếu ai đó đang muốn nhấn mạnh nhiều hơn dấu phẩy, tôi là một fan hâm mộ:

"1,200".chars.grep(/\d/).join.to_i

dunno về hiệu suất nhưng, nó linh hoạt hơn a gsub, tức là:

"1-200".chars.grep(/\d/).join.to_i

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.