Обрежьте конечный .0

У меня есть столбец Excel, содержащий номера деталей. Вот пример

Как вы можете видеть, это может быть много разных типов данных: Float, Int и String. Я читаю файл, используя roo gem. Проблема в том, что roo интерпретирует целые ячейки как Float, добавляя к ним конечный ноль (16431 = > 16431.0). Я хочу обрезать этот конечный ноль. Я не могу использовать to_i, потому что он будет обрезать все конечные числа ячеек, для которых требуется десятичное число (первая строка в приведенном выше примере), и вырезает все после строки char в строках 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?

Ответ 1

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

Ответ 3

Try:

"16431.0".to_i
#=> 16431

Ответ 4

Это должно охватывать ваши потребности в большинстве случаев: 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>