2013-08-30 14 views
11

部品番号を含むExcelの列があります。 FloatInt、およびString:ここではサンプル末尾を切り取る。

は、あなたが見ることができるように、それは多くの異なるデータ型可能です。私はファイルを読むためにroo gemを使用しています。問題は、rooが整数セルをFloatと解釈し、後続のゼロを加算することです(16431 => 16431.0)。この末尾のゼロをトリムしたい。 to_iを使用することはできません。これは、上の例の最初の行の10進数を必要とするセルの末尾の数字をすべてトリミングし、String行の文字列charの後のすべてを切り捨てます(上記の例の最後の行)。

現在、私はセルの最後の2つの文字をチェックし、彼らは「0.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 

や、文字列から:引数true:

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 = result.to_iならresult == result.to_i – peter

0

試してみてください。

"16431.0".to_i 
#=> 16431 
+1

実際に10進数を持つセルの浮動小数点数を維持する必要があるため、私は 'to_i'を使用できません。質問が更新されました。 –

+0

@DanGarmanこの回答はあなたのニーズを満たしていないと私は理解していますが、あなたの 'トリミング'もそうではありません。 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

15

ActionViewはstrip_insignificant_zerosを取るnumber_with_precisionメソッドを持っていますこれを処理します。

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

+1

これが受け入れられる回答である必要があります – bpercevic

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> 
関連する問題