2009-05-28 6 views
1

タブで区切られたファイルを分割した後、必要な値が文字列変数に含まれています。残念ながら、このファイルのソースは私のコントロール外です。ルビーのエキスパート:このルビコードの改善を助けたり、提案したりできますか?

  1. "5.344"
  2. "-2.345"
  3. "-.977"

お知らせホワイトスペース:

は、ここで値を保持するかもしれないものの3正確な例であり、小数点の前に「0」はなく、二重引用符は文字列内にあります。私は私のフィールド変数に各1を持っていたら、これは私が現在やっているものです:

int_val = BigDecimal(value_as_string.gsub(/-\./,"-0.").gsub(/\"/,'').strip).round(0).to_i 

は、私が最も近い整数(.to_iは切り捨て)に丸められ、各1を必要としています。私は助けることができるように任意のより良いアイデアが大いに評価されるだろうが、これはこの悪臭!

答えて

7
def round(s) 
    s.to_f.round 
end 

round("5.344") # 5 
round("-2.345") # -2 
round("-.977") # -1 
+0

その答えをありがとう。私の変数は次のようなものですが、まだ少し余分に必要ですが、 ラウンド( '"5.344"') です。文字列には二重引用符が含まれます。 – tsdbrown

+0

s( '"'、 '')。to_f.round –

+0

@tsdbrown:この場合の 's'は、あなたの初期コードですでに述べたようにgsubを実行した後の文字列です。 round(value_as_string.gsub(/-./,"-0。 ")。gsub(/ \" /、 '')ストリップ)を呼び出します。 –

0
def round(str) 
    val = BigDecimal(str.gsub(/-\./,"-0.").gsub(/\"/,'').strip) 

    if val < 0 then 
    return val.floor.to_i 
    else 
    return val.ceil.to_i 
    end 
end 
1

この式は、数字が、everyting、削除、文字列をきれいにします - 最初のGSUBまたは小数のドットを第二GSUBは前に0を追加します。 (存在する場合は - 記号をつけてください)

some_value.gsub(/[^-\.0-9]/, '').gsub(/^(-?)(\.)/,'\10\2') 

次に、to_f.roundで十分である必要があります。最終的なものは次のようになります

def myround(value) 
    value.gsub(/[^-\.0-9]/, '').gsub(/^(-?)(\.)/,'\10\2').to_f.round 
end 
関連する問題