2013-08-30 68 views
11

我有一个包含零件号的Excel列。下面是一个简单修剪结尾.0

正如你所看到的,也可以是多种不同的数据类型:FloatIntString。我正在使用roo gem来读取文件。问题是roo将整数单元解释为Float,向它们添加尾随零(16431 => 16431.0)。我想修剪这个尾随零。我不能使用to_i,因为它将修剪所有需要小数点的单元格的尾部数字(上例中的第一行),并将在String行(上例中的最后一行) )。

目前,我有一个,检查电池的最后两个字符和修剪他们,如果他们是” .0"

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

这工作的方法,但感觉可怕的,哈克。将我的Excel文件内容导入Ruby数据结构的正确方法是什么?

回答

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 

,或者从字符串:

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

或只是结果= result.to_i如果结果== result.to_i – peter

0

尝试:

"16431.0".to_i 
#=> 16431 
+1

,因为我需要维护,其实在他们身上有小数细胞的浮动质量我不能使用'to_i'。问题已更新。 –

+0

@DanGarman我明白这个答案并不能满足你的需求,但是你的'trim'不太好。当float不应该转换为整数时,它返回'nil'。 – sawa

+0

为什么要投票?我的回答没有错,这个问题没有提到这个要求... –

-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

这与我的答案的第一部分相同,只是你不做记忆。 – sawa

+0

正确。在我开始写作时没有看到它。 现在就编辑它。 – jomo

+0

'convert_string(“1.00”)#=>“1.00”','convert_string(“1.20”)#=>“1.20”' – sawa

0

这应包括您的需求在大多数情况下:some_value.gsub(/(\.)0+$/, '')

它修剪所有尾随零,随后仅由零小数点。否则,它只会留下字符串。

它也是非常高效的,因为它完全基于字符串,不需要浮点或整数转换。 (假设你的输入值已经是一个字符串)

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>