2010-12-20 5 views
1

人間が読める短縮番号を実際の整数に変換するには、Rubyの最善の方法は何ですか?Rubyで短縮番号を解析する

例:

"1.2M" => 1200000 
"477k" => 477000 
+0

あなたはこれを行うためのlibを見つけることができない場合 - あなたはおそらくされます - どのように多くの略語がありますか? 20未満の場合は、数分でコード化することができます。 –

+0

'k'は' 1000'か '1024'を表すべきですか?前者の場合、 '1024 'に' ki'をサポートする必要がありますか? – Phrogz

答えて

3
module SIValue 
    # http://en.wikipedia.org/wiki/SI_prefix 
    PREFIX_MAGNITUDES = { 
    'Y' => 24, 'Z' => 21, 'E' => 18, 'P' => 15, 'T' => 12, 
    'G' => 9, 'M' => 6, 'k' => 3, 'h' => 2, 'da' => 1, 
    'd' => -1, 'c' => -2, 'm' => -3, 'μ' => -6, 'n' => -9, 
    'p' => -12, 'f' => -15, 'a' => -18, 'z' => -21, 'y' => -24 
    } 
    def self.from(str) 
    _, num, prefix = str.match(/^([-+]?[0-9]*\.?[0-9]+(?:[eE][-+]?[0-9]+)?)(#{PREFIX_MAGNITUDES.keys.join('|')})?/o).to_a 
    if num 
     prefix ? num.to_f * 10**PREFIX_MAGNITUDES[prefix] : num.to_f 
    else 
     0.0 
    end 
    end 
end 

%w[ 1k +3.3m +3.3M 123.123da 0.31h 0.31μ cats ].each do |s| 
    p [s,SIValue.from(s) ] 
end 
#=> ["1k", 1000.0] 
#=> ["+3.3m", 0.0033] 
#=> ["+3.3M", 3300000.0] 
#=> ["123.123da", 1231.23] 
#=> ["0.31h", 31.0] 
#=> ["0.31μ", 3.1e-07] 
#=> ["cats", 0.0] 
+0

変換するのを避けるために、キーの記号ではなく文字列を使用していますが、かなり良いようです。 _変数を使用しないこともお勧めします。それはそのようなパーリズムです。 Perlismを避けてください。 –

+0

Heh、ちょうど文字列を使用するように変換中です:)最初のマッチを便利に無視する方がいいですか? – Phrogz

+0

"最初の試合を便利に無視するには良い方法がありますか?"結果をスライスしてunbeliever ...をスキップします。間違った値: '[1 ..- 1]'または '[1,2]' –

0
def scale s 
    a = s.downcase.split /(?=[a-z])/ 
    Integer(a.first.to_f * Hash.new(1).merge('k' => 1024, 'm' => 1024 * 1024)[a[1]] + 0.5) 
end 

# you may want to extend the hash with more suffix types 
関連する問題