2011-09-18 1 views
5

Ruby에서 센트에서 달러로 올바르게 변환하고 싶습니다. 나는 센트의 분수로 일할 필요가 없을 것이다.BigDecimal을 사용하지 않고 센트를 루비의 달러 문자열로 변환합니다.

BigDecimal을 사용하지 않고 부동 소수점 오류없이 올바르게 수행 할 수 있습니까? 다음 달러

"99" => "0.99" 
"324" => "3.24" 

예를 들면 센트가 작동하는 것 같다,하지만, 맞습니까?

(cents.to_i/100.0).to_s 
+0

필요한 정밀도에 따라 다릅니다. 정밀도가 괜찮 으면 돈 젬으로 가라. – Philip

답변

3

개인적으로 나는이 특정 휠을 다시 발명하려고 시도하지 않고 money gem과 함께합니다. 워드 프로세서에서 (강조는 추가) :

은 그 가치와 그 통화로

돈의 특정 금액에 대한 모든 정보를 캡슐화하는 돈 클래스를 제공합니다 특징.

화폐 단위 에 대한 모든 정보를 캡슐화하는 Money :: Currency 클래스를 제공합니다.

통화 값을 정수로 나타냅니다 (센트 단위). 이 은 부동 소수점 반올림 오류를 방지합니다.

통화를 으로 표시합니다. Money :: Currency 인스턴스는 높은 수준의 유연성을 제공합니다.

한 통화에서 다른 통화로 돈을 교환하기위한 API를 제공합니다.

해당 Money/Currency 개체로 통화 및 통화 문자열을 구문 분석 할 수있는 기능이 있습니다.

+0

실제로 money gem [BigDecimal] (https://github.com/RubyMoney/money/blob/master/lib/money/money/arithmetic.rb)을 사용하여 나누기를 수행합니다. – Philip

+0

충분합니다. 제가 말했듯이, OP는 그가하고자하는 것을 너무 많이 말하지 않았지만, 누군가는 이미 다른 사람이 그것을했을 때 돈의 모든 복잡함을 다루기를 원하지 않습니다. –

8

Micheal Kohl already answered : 돈 보석을 살펴보십시오.

예 :

require 'money' 
Money.use_i18n = false #https://stackoverflow.com/q/31133229/676874 
puts Money.new(99, 'USD') 
puts Money.new(324, 'USD') 

다음에 나오는이 작동하는 것 같다,하지만이 정확한지?

처음보기에
(cents.to_i/100.0).to_s 

, 괜찮아요,하지만 :

cents = '10' 
p (cents.to_i/100.0).to_s # -> '0.1' 

당신은 2 개 자리가 없습니다.

대안 :

p '%.2f' % (cents.to_i/100.0) # -> '0.10' 
+7

"이 보석 사용"대신 솔루션을 제공해 주셔서 감사합니다. –

1

당신은뿐만 아니라 유리수를 사용하여 고려할 수 있습니다.

"%.2f" % Rational("324".to_i,100) 
#=> "3.24" 
"%.2f" % Rational("99".to_i,100) 
#=> "0.99" 
"%.2f" % Rational("80".to_i,100) 
#=> "0.80" 
"%.2f" % Rational("12380".to_i,100) 
#=> "123.80" 
4

그들은 이미 문자열 조작을 사용할 수 따가워있어 완전히 숫자 문제를 무시하는 경우 :

# There are, of course, all sorts of ways to do this. 
def add_decimal(s) 
    pfx = [ '0.00', '0.0', '0.' ] 
    if(pfx[s.length]) 
     s = pfx[s.length] + s 
    else 
     s = s.dup 
     s[-2, 0] = '.' 
    end 
    s 
end 

add_decimal('')  # "0.00" 
add_decimal('1')  # "0.01" 
add_decimal('12') # "0.12" 
add_decimal('123') # "1.23" 
add_decimal('1234') # "12.34" 
add_decimal('12345') # "123.45" 

아니 그러나, 나는 확실히 그들이 때 sprintf와 에드을 수레로 변환 얻을하지 있어요 정밀도 문제, 부동 소수점 없음, bignums 없음, 합리적인, 아무것도 교묘 한, 영리한 아무것도. 음수 값을 처리하기 위해 간단한 수정이 필요할 수 있지만 이미 존재하는 것만 큼 단순합니다.