代码之家  ›  专栏  ›  技术社区  ›  Dan Garman

修剪尾部。0

  •  16
  • Dan Garman  · 技术社区  · 11 年前

    我有一个包含零件号的Excel列。这是一个样品

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

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

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

    这是有效的,但感觉很糟糕,很粗糙。将Excel文件内容转换为Ruby数据结构的正确方法是什么?

    4 回复  |  直到 8 年前
        1
  •  44
  •   sawa    11 年前
    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
  •  37
  •   the Tin Man    5 年前

    对于那些使用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 有关详细信息,请参阅文档。

        3
  •  3
  •   the Tin Man    5 年前

    在大多数情况下,这应满足您的需求: 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>
    
        4
  •  -1
  •   jomo    11 年前

    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