2010-12-20 2 views
1

인간이 읽을 수있는 축약 된 숫자를 실제 정수로 변환하는 가장 좋은 방법은 무엇입니까?Ruby에서 축약 된 숫자를 구문 분석하십시오.

예 :

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

이 할 수있는 LIB 찾을 수없는 경우 - 당신은 아마 것 - 얼마나 많은 약어가 있습니까? 20 개 미만인 경우 몇 분 안에 코드를 작성할 수 있습니다. –

+0

'k'가 '1000'또는 '1024'를 나타내야합니까? 전자의 경우'1024 '에 대해'기 '를 지원해야합니까? – 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입니다. Perlism을 피하십시오. –

+0

ㅎ, 문자열을 사용하도록 변환하는 중이었습니다 :) 첫 번째 일치를 편리하게 무시하는 더 나은 방법이 있습니까? – Phrogz

+0

"첫 번째 경기를 편리하게 무시할 수있는 더 나은 방법이 있습니까?" 결과를 슬라이스하여 불신자를 건너 뜁니다 ... 오류, 원하지 않는 값 :'[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 
관련 문제