인간이 읽을 수있는 축약 된 숫자를 실제 정수로 변환하는 가장 좋은 방법은 무엇입니까?Ruby에서 축약 된 숫자를 구문 분석하십시오.
예 :
"1.2M" => 1200000
"477k" => 477000
인간이 읽을 수있는 축약 된 숫자를 실제 정수로 변환하는 가장 좋은 방법은 무엇입니까?Ruby에서 축약 된 숫자를 구문 분석하십시오.
예 :
"1.2M" => 1200000
"477k" => 477000
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]
변환하는 것을 피하기 위해 키 대신 기호를 사용하는 것이 좋을 것 같습니다. 또한 _ 변수를 사용하지 않는 것이 좋습니다. 그것은 그러한 Perlism입니다. Perlism을 피하십시오. –
ㅎ, 문자열을 사용하도록 변환하는 중이었습니다 :) 첫 번째 일치를 편리하게 무시하는 더 나은 방법이 있습니까? – Phrogz
"첫 번째 경기를 편리하게 무시할 수있는 더 나은 방법이 있습니까?" 결과를 슬라이스하여 불신자를 건너 뜁니다 ... 오류, 원하지 않는 값 :'[1 ..- 1]'또는'[1,2]' –
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
이 할 수있는 LIB 찾을 수없는 경우 - 당신은 아마 것 - 얼마나 많은 약어가 있습니까? 20 개 미만인 경우 몇 분 안에 코드를 작성할 수 있습니다. –
'k'가 '1000'또는 '1024'를 나타내야합니까? 전자의 경우'1024 '에 대해'기 '를 지원해야합니까? – Phrogz