Обрежьте конечный .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
Ответ 2
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
http://api.rubyonrails.org/classes/ActionView/Helpers/NumberHelper.html#method-i-number_with_precision
Ответ 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>
Ответ 5
Числовые значения возвращаются как 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