16

我有一个包含零件号的 Excel 列。这是一个示例

如您所见,它可以是许多不同的数据类型:FloatIntString. 我正在使用roogem 来读取文件。问题在于roo将整数单元格解释为Float,向它们添加尾随零 (16431 => 16431.0)。我想修剪这个尾随零。我不能使用to_i,因为它会修剪所有需要小数点的单元格的尾随数字(上例中的第一行),并将剪切String行中字符串 char 之后的所有内容(上例中的最后一行)。

目前,我有一个方法可以检查单元格的最后两个字符,如果它们是“.0”,则修剪它们

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

这行得通,但感觉很糟糕和hacky。将我的 Excel 文件内容转换为 Ruby 数据结构的正确方法是什么?

4

4 回答 4

44
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
于 2013-08-30T12:41:56.250 回答
34

对于那些使用 Rails 的人,ActionView 有number_with_precision一个接受参数的方法strip_insignificant_zeros: true来处理这个问题。

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

有关更多信息,请参阅number_with_precision文档。

于 2016-10-09T11:29:06.317 回答
3

在大多数情况下,这应该可以满足您的需求: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>
于 2017-04-11T19:41:49.617 回答
-1

数值作为类型返回: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
于 2013-08-30T12:49:57.110 回答