2010-05-06 40 views
43

Tôi tự hỏi chức năng tiện lợi trong Rails là gì để chuyển đổi chuỗi có ký hiệu âm thành một số. ví dụ. -1005.32đường ray chuyển đổi chuỗi thành số

Khi tôi sử dụng phương pháp .to_f, số sẽ trở thành 1005 với dấu âm và phần thập phân bị bỏ qua.

+0

Bạn có lưu trữ kết quả trong phần int thay vì phao không? – Shaji

Trả lời

66

.to_f là đúng cách.

Ví dụ:

irb(main):001:0> "-10".to_f 
=> -10.0 
irb(main):002:0> "-10.33".to_f 
=> -10.33 

Có lẽ chuỗi của bạn không bao gồm thường xuyên "-" (dấu gạch ngang)? Hoặc có một khoảng trống giữa dấu gạch ngang và chữ số đầu tiên không?

Added:

Nếu bạn biết rằng chuỗi đầu vào của bạn là một chuỗi phiên bản của một số nổi, ví dụ, "10,2", sau đó .to_f là cách tốt nhất/đơn giản nhất để làm việc chuyển đổi.

Nếu bạn không chắc chắn về nội dung của chuỗi, thì sử dụng .to_f sẽ cung cấp 0 trong trường hợp bạn không có bất kỳ số nào trong chuỗi. Nó sẽ cung cấp cho các giá trị khác nhau tùy thuộc vào chuỗi đầu vào của bạn quá. Ví dụ:

irb(main):001:0> "".to_f 
=> 0.0 
irb(main):002:0> "hi!".to_f 
=> 0.0 
irb(main):003:0> "4 you!".to_f 
=> 4.0 

Hành vi trên .to_f có thể chỉ là những gì bạn muốn, tùy thuộc vào trường hợp sự cố của bạn.

Tùy thuộc vào những gì bạn muốn làm trong các trường hợp lỗi khác nhau, bạn có thể sử dụng Kernel::Float như Mark Rushakoff đề xuất, vì nó gây ra lỗi khi không hoàn toàn hài lòng với việc chuyển đổi chuỗi đầu vào.

24

Bạn nên sử dụng Kernel::Float để chuyển đổi số; trên đầu vào không hợp lệ, điều này sẽ làm tăng lỗi thay vì chỉ "cố gắng" để chuyển đổi.

>> "10.5".to_f 
=> 10.5 
>> "asdf".to_f # do you *really* want a zero for this? 
=> 0.0 
>> Float("asdf") 
ArgumentError: invalid value for Float(): "asdf" 
    from (irb):11:in `Float' 
    from (irb):11 
>> Float("10.5") 
=> 10.5 
+4

Một trong những điều tốt đẹp về 'Float()' trái ngược với 'Integer' là trước đây không chuyển đổi '010' thành' 8' (Integer liên quan đến một cái gì đó bắt đầu bằng '0' như bát phân) –

+0

@AndrewGrimm Hoặc bạn chỉ có thể truyền căn cứ chính xác vào làm đối số thứ hai: 'Số nguyên (" 010 ", 10) # => 10' (Xem [Kernel # integer'] (http://ruby-doc.org/core/Kernel. html # method-i-Integer)) – Ajedi32

Các vấn đề liên quan