2013-08-30 39 views
11

Tôi có một cột Excel có chứa một phần số. Đây là một mẫuCắt một đường nhỏ .0

Như bạn thấy, nó có thể có nhiều kiểu dữ liệu khác nhau: Float, Int, và String. Tôi đang sử dụng roo đá quý để đọc tệp. Vấn đề là roo diễn giải các ô số nguyên là Float, thêm dấu 0 vào chúng (16431 => 16431.0). Tôi muốn cắt dấu 0 này. Tôi không thể sử dụng to_i vì nó sẽ cắt tất cả các số sau của các ô yêu cầu số thập phân trong chúng (hàng đầu tiên trong ví dụ trên) và sẽ cắt mọi thứ sau chuỗi char trong các hàng String (hàng cuối cùng trong ví dụ trên)).

Hiện nay, tôi có một phương pháp để kiểm tra hai ký tự cuối cùng của tế bào và Trims họ nếu họ là" .0"

def trim(row) 
    if row[0].to_s[-2..-1] == ".0" 
     row[0] = row[0].to_s[0..-3] 
    end 
end 

này hoạt động, nhưng nó cảm thấy khủng khiếp và hacky. Cách thích hợp để đưa nội dung tệp Excel của tôi vào cấu trúc dữ liệu Ruby là gì?

Trả lời

40
def trim num 
    i, f = num.to_i, num.to_f 
    i == f ? i : f 
end 

trim(2.5) # => 2.5 
trim(23) # => 23 

hay, từ chuỗi:

def convert x 
    Float(x) 
    i, f = x.to_i, x.to_f 
    i == f ? i : f 
rescue ArgumentError 
    x 
end 

convert("fjf") # => "fjf" 
convert("2.5") # => 2.5 
convert("23") # => 23 
convert("2.0") # => 2 
convert("1.00") # => 1 
convert("1.10") # => 1.1 
+1

hoặc chỉ kết quả = result.to_i nếu kết quả == result.to_i – peter

0

Hãy thử:

"16431.0".to_i 
#=> 16431 
+1

Tôi không thể sử dụng 'to_i' vì tôi cần duy trì chất lượng nổi của các ô thực sự có số thập phân trong chúng. Đã cập nhật câu hỏi. –

+0

@DanGarman Tôi hiểu rằng câu trả lời này không đáp ứng được nhu cầu của bạn, nhưng 'trim' của bạn cũng không phù hợp. Nó trả về 'nil' khi float không được chuyển đổi thành một số nguyên. – sawa

+0

Tại sao bỏ phiếu? Câu trả lời của tôi không sai, câu hỏi không đề cập đến yêu cầu này ... –

-1

Numeric values are returned as type :float

def convert_cell(cell) 
    if cell.is_a?(Float) 
    i = cell.to_i 
    cell == i.to_f ? i : cell 
    else 
    cell 
    end 
end 

convert_cell("foobar") # => "foobar" 
convert_cell(123) # => 123 
convert_cell(123.4) # => 123.4 
+0

Điều đó giống như phần đầu tiên của câu trả lời của tôi, ngoại trừ việc bạn không ghi nhớ. – sawa

+0

chính xác. không nhìn thấy nó khi tôi bắt đầu viết. Đã chỉnh sửa ngay bây giờ. – jomo

+0

'conversion_string (" 1.00 ") # =>" 1.00 "', 'conversion_string (" 1.20 ") # =>" 1.20 "' – sawa

15

ActionView có phương pháp number_with_precision mà phải mất một strip_insignificant_zeros: Lập luận đúng là xử lý này.

number_with_precision(13.00, precision: 2, strip_insignificant_zeros: true) 
# => 13 
number_with_precision(13.25, precision: 2, strip_insignificant_zeros: true) 
# => 13.25 

http://api.rubyonrails.org/classes/ActionView/Helpers/NumberHelper.html#method-i-number_with_precision

+1

Đây phải là câu trả lời được chấp nhận – bpercevic

0

này nên bao gồm nhu cầu của bạn trong hầu hết các trường hợp: some_value.gsub(/(\.)0+$/, '')

Nó Trims tất cả zero trailing và một dấu thập phân sau đó chỉ bằng zero. Nếu không, nó để lại chuỗi một mình.

Nó cũng rất hiệu quả, vì nó hoàn toàn dựa trên chuỗi, không yêu cầu chuyển đổi dấu chấm động hoặc số nguyên. (Giả sử giá trị đầu vào của bạn đã là một chuỗi)

Loading development environment (Rails 3.2.19) 
irb(main):001:0> '123.0'.gsub(/(\.)0+$/, '') 
=> "123" 
irb(main):002:0> '123.000'.gsub(/(\.)0+$/, '') 
=> "123" 
irb(main):003:0> '123.560'.gsub(/(\.)0+$/, '') 
=> "123.560" 
irb(main):004:0> '123.'.gsub(/(\.)0+$/, '') 
=> "123." 
irb(main):005:0> '123'.gsub(/(\.)0+$/, '') 
=> "123" 
irb(main):006:0> '100'.gsub(/(\.)0+$/, '') 
=> "100" 
irb(main):007:0> '127.0.0.1'.gsub(/(\.)0+$/, '') 
=> "127.0.0.1" 
irb(main):008:0> '123xzy45'.gsub(/(\.)0+$/, '') 
=> "123xzy45" 
irb(main):009:0> '123xzy45.0'.gsub(/(\.)0+$/, '') 
=> "123xzy45" 
irb(main):010:0> 'Bobby McGee'.gsub(/(\.)0+$/, '') 
=> "Bobby McGee" 
irb(main):011:0> 
Các vấn đề liên quan