Barry Gallagher
그는 물었다 11년 전
315

최상의 방법을 지정하십시오. 취급료 통화화 / 비용도요.

39 쇼핑 카트 i&, m working on a 아주 기본적인 시스템.

I have a table '아이템' 열 '가격' 정수 '유형' 에 있다.

39 m mpfs 디스플레이하여 i&, 내 보기에 가치 대비 가격을 모두 포함하는 유로 · 기록했습니다. 내가 무언가 빠진 명백하네 멀리는 취급료 화폐 단위로 레일을 레임워크 우려되고 있다.

stom
그는 5년 전 댓글을 달았습니다
0

누군가 '' 는 sql 관심용 소수 (19 · 4) 는 서울문화사에서 솔루션으로서의 확인란 [이] (http://stackoverflow.com/questions/224462/storing-money-in-a-decimal-column-what-precision-and-scale) 도 확인란 [here] (http://www.thefinancials.com/Default.aspx? = 커포르마 서브체티오니트) 세계 통화화 형식식 결정할 소수점 가부키쇼 사용할 수 있다.

답변 12 개

39, ll you& '소수' 방식의 데이터베이스의 사용해야 할 것이다. In your 마이그레이션까지 뭔가 다음과 같습니다.

# precision is the total number of digits
# scale is the number of digits to the right of the decimal point
add_column :items, :price, :decimal, :precision => 8, :scale => 2

이 같은 ',' 에서 ',' 방식의 반환됨 레일 소수 비히데키멀 원하는거요 멋지구리해요 가격을 것이다.

준수하십시오 경우 정수, 사용하여 수동으로 해야 할 것입니다 '의 모든 고통을 주고 있는 그냥 변환하십시오 비히데키멀 될 것입니다.

가격은 에서 지적한 대로, 내측 측부 인대 인쇄하려면 사용합니다.

number_to_currency(price, :unit => "€")
#=> €1,234.01

rlandster
Barry Gallagher
그는 11년 전 댓글을 달았습니다
0

중성미자 및 몰프 충고 감사드립니다! 나는 내 가격 표시 후속 질문 - 어떻게 한 함께 사용하여 소수점 두 정확도를 비히데키멀? 현재 '귀국' 는 아메드 프라이스 &quot 12.5"; 대신 12.50&quot "; .

Sarah Mei
그는 11년 전 댓글을 달았습니다
47

사실 it& # 39 의 정수 훨씬 사용하기 쉽고 안전하게 함께 acts_as_dollars. 부동 소수점 비교를 통해 달린 적 있어? 그렇지 않으면 don& t # 39, 이를 처음 경험하십시오. ) # 39 의 형식을 통해 물건을 넣을 acts_as_dollars it& 12.34 에 저장되지만, 1234년, 정보기술 (it) 로 12.34 나옵니다.

Kris
그는 11년 전 댓글을 달았습니다
3

또한 컴팩트형 클래스를 사용하여 텍스트 파일로 저장할 수 있는 돈이 돈을 시리얼화된 또는 composed_of 열

molf
그는 11년 전 댓글을 달았습니다
50

@Sarah 메이. 소수점 형식으로 정확하게 비히데키멀스 + 열 것을 방지한다.

Joshua Pinter
그는 9년 전 댓글을 달았습니다
1

난 그 돈을 사용 농담하십니까 컴팩트형 켄 마이어 제안됩니다 같습니다. 지금 현재 필요한 경우에도 it& # 39 을 조금 넘는 것으로, 향후 it set you up 있다는 것입니다. 그냥 느낌이 그래, 나도.

Jon Cairns
그는 8년 전 댓글을 달았습니다
110

39 의 중요한 것은 이 질문에 그냥 무턱대고 it& 복제본에 - precisiontm 8bpc, 배율입니다 2 사용하면 최대값인 999,999.99. 보다 큰 수를 하는 경우 만 어졌다면 증가되지는 precisiontm!

Beat Richartz
그는 7년 전 댓글을 달았습니다
22

39 의 또 다른 중요한 이유는 it& 함부로 사용하지 않을 경우 다른 통화로 - 북 아프리카, re 취급료 you& 배율 2 # 39 와 같은 일부 및 아랍 각국의 오만 리알 또는 튀니지 디나르 투명지에 확장성으로 도왔으매 precisiontm 배율입니다 3 보다 적절한 저기예요 8 3

Sebastian
그는 7년 전 댓글을 달았습니다
4

내 경험상 비히데키멀 큰 고통을 많이유 산술 수행하면 됩니다. 사용할 수 있으며, 매우 느린 최대 유효 자릿수를 촬영 됩니다 (어디서 읽었는데 여기서 n 은 성능이 O (n) = 자릿수). 간단한 비히데키멀 (& # 39, 12.34& # 39;) ' * 비히데키멀 (& # 39, 1.19& # 39;) (3) '결과 45 개 (5) / 비히데키멀 자파워 빅드 유효 사용. 이를 방지하기 위해 you& # 39; d '비히데키멀 (& # 39, 12.34& # 39;) 쓰지 않을 오무르트 (비히데키멀 (& # 39, 1.19& # 39;) 자파워 (5), 10) 이디프 (비히데키멀 (3), 10)'

cbron
그는 7년 전 댓글을 달았습니다
0

또한, 8.619999999999999) 가 일시적으로 &quot 8.62 &quot. 실제로 db 에 저장된 얻을 때까지 실패할 수 있는 regex validations.

Dean
그는 7년 전 댓글을 달았습니다
3

39 의 정수 저장하였습니다 it& 훨씬 더 안전하게 사용할 수 있습니다. 루비머니 체크아웃합니다 컴팩트형: https://github.com/RubyMoney/money-rails

Dennis
그는 7년 전 댓글을 달았습니다
4

39 세대 모델의 경우, re 추가 및 확장성으로 you& precisiontm emc. 할 단계에서는 랩 &prs. 따옴표로! Wrong: 품목으로부터 {} '소수' 레일 g 모델 가격은 8.2. Correct: '레일 {} & # 39, & # 39 품목으로부터 ᄀ씨 모델 가격은 소수점 8.2,'. 이 문제가 수정되었습니다 의 [레일 사용 설명서] (https://github.com/rails/rails/pull/12642/files). # 39 이 경우, t 쿼트에 don& 너회의 마이그레이션과 파일은 다음과 같습니다. ',' 와 t.decimal8 가격 t.decimal2 가격 인해 오류.

Ken Mayer
그는 6년 전 댓글을 달았습니다
3

알고 있는 유형 변환. 어떤 계산을 해야 할 경우, t an 암시적입니다 좁히어 isn& # 39 로 변환하는 부동 (예를 들어, 부동 소수점 = &gt 비히데키멀 * 부동 소수점). 내가 하는 많은 &quot 다니엘을 0.05.to_d"; # 39 m, 내 모든 것을 확인할 수 있도록 코드를 I& 작업공간에서 apc® 비히데키멀 세계.

일반적인 방법은 취급료 통화화 사용하는 소수 유형:. 다음은 간단한 예를 통해, 애자일 웹 개발 함께 &quot Rails&quot.

add_column :products, :price, :decimal, :precision => 8, :scale => 2 

이렇게 하면 999,999.99 999,999.99 에서 처리할 수 있다. 이 같은 항목에 검증 포함할 수도 있습니다.

def validate 
  errors.add(:price, "should be at least 0.01") if price.nil? || price < 0.01 
end 

위생 검사 대한 당신의 가치다.

Larry K
그는 11년 전 댓글을 달았습니다
1

또한 SQL sum, 친구들이 이 솔루션을 사용할 수 있습니다.

Galaxy
그는 9년 전 댓글을 달았습니다
4

당신이 할 것 같습니다.

가격 검증, presence = &gt. 참, 누메리카리티 = &gt. = {:greater_than &gt. 0}

Postgres 사용하는 경우 (re in # 39 we& 뒤, 2017년 현재) 는 그들의 '유형' 열 노력하잖니 돈을 열거하십시오 할 수 있습니다

add_column :products, :price, :money, default: 0

돈을 레일 컴팩트형 사용합니다. 이 모델의 핸들을 비용 및 통화 중에 누구도 당신의 포맷하십시오 a bunch of 갖추고 있다.

Chad M
그는 4년 전 댓글을 달았습니다
0

네, I agree with this. 일반적으로 돈을 내가 핸들을 저장하여, 이를 사용하여 센트 (정수) 같은 돈 (돈을 레일) 또는 컴팩트형 같은 역할을 하며 돈을 처리할 수 있는 데이터 인메모리를. 그 모든 것을 취급료 그 못된 를 얻는다. E. g. 0.2 * 3 = &gt. 0.6000000000000001 물론 이 경우, t # 39 의 don& 때만 분수 처리해야 하는 줄어들었습니다.

mooreds
그는 4년 전 댓글을 달았습니다
0

이것은 매우 좋은 사용할 경우 않는다. # 39 의 드롭합니다 및 don& 걱정, 소수 열 문제가 없다. 이와 함께 사용하는 경우, 이 질문에 대해서도 보기입니다 도움이 될 수 있습니다. https://stackoverflow.com/questions/18898947/rails-number-field-alternative-for-decimal-values

Using [가상 속성 (https://partner. microsoft. 개정됩니다 (유료) 레일즈카스트)] (http://railscasts.com/episodes/16-virtual-attributes-revised) 에서 열 및 추가 price_in_cents 보관할 수 있습니다 (정수) 의 가상 속성용 price_in_dollars getter 및 제품 모델을 비호환성의 세터.

# Add a price_in_cents integer column
$ rails g migration add_price_in_cents_to_products price_in_cents:integer

# Use virtual attributes in your Product model
# app/models/product.rb

def price_in_dollars
  price_in_cents.to_d/100 if price_in_cents
end

def price_in_dollars=(dollars)
  self.price_in_cents = dollars.to_d*100 if dollars.present?
end

출처: [레일즈카츠 # 016. 가상 속성뿐 ] (http://railscasts.com/episodes/16-virtual-attributes-revised): 가상 속성은 양식 필드를 직접 매핑할 수 없는 깨끗한 추가하는 방법 데이터베이스입니까. 나는 여기서 어떻게 처리할 것인지, 연결, more. validations 표시

지금 사용하고 있는 it this way.

number_to_currency(amount, unit: '€', precision: 2, format: "%u %n")

물론, 통화 기호, precisiontm 포맷하여 드릴링됩니다 달려 있는 각 통화화.

누군가 마이그레이션과 사용하여 다음과 같은 항목을 볼 것 "이라고 말했다

add_column :products, :price, "decimal(8,2)"

속편 및 확장하세요. precisiontm 무시하고 짐작이지만요.

(Sql 버전: 속편 (3.39.0, 3.38.0))

말해둘꼐요 정수.

비록 '루비' 의 순수한 부동 계속 제공하십시오 비히데키멀 1.5 기술적으로 존재합니다.

조금 업데이트 및 결합 / 로 의 개발에 대한 합의의 모든 일부 어스파이어링 초보자 곧 이리와라 일부 설명.

Apc® 돈으로

'돈' 의 데이터베이스 (db) 를 사용하여 소수 저장하였습니다 @molf 제안됩니다 때문에 (그리고 회사에서는 비호환성의 황금 표준 작업을 할 때 어떻게 내 돈으로).

# precision is the total number of digits
# scale is the number of digits to the right of the decimal point
add_column :items, :price, :decimal, precision: 8, scale: 2
몇 점:

'-' 소수 교체품으로 사용할 수 있는 많은 문제를 해결할 수 있는 '' 비히데키멀 예정이다.

'-' precisiontm '와' 확장성으로 틀렸다니까 사이트용 따라 조정해야 합니다

  • '를 사용하는 경우, 수신 및 전송 지불액 precisiontm: 8 '와' 비율: '2' 를 사용하면, 이는 '으로 999,999.99 최고 금액으로 90% 의 벌금을 건으로 집계됐다.

  • 속성 값을 나타내는 데 필요한 경우, 또는 드물게 높은 자동차 콩지름에 'precisiontm'.

  • 위치좌표 (경도와 위도) 를 사용하는 경우, 너희는 배율입니다 '높은' 합니다.

마이그레이션과 생성하는 방법

이 같은 내용을 실행하십시오 마이그레이션과 생성할 수 있는 터미널.

bin/rails g migration AddPriceToItems price:decimal{8-2}
또는

bin/rails g migration AddPriceToItems 'price:decimal{5,2}'
이 설명에 따라 [블로그] (http://mitrev.net/rails/2015/04/19/rails-migration-generator-specifying-precision-and-scale/) 게시물로의.

통화화 포맷

[KISS] (https://en.wikipedia.org/wiki/KISS_principle) 및 사용 내장현 누구도 추가 라이브러리보다는 goodbye. '및' 를 사용하여 number_to_currency @molf @facundofarias 제안했다.

함께 즐길 수 있는 number_to_currency '도우미', '' & # 39 의 레일 콘솔입니다 전송하십시오 호출 스티브 스포르트 누마버헬퍼 '클래스' 를 액세스하려면 미접촉 t 세포.

예를 들면 다음과 같습니다.

ActiveSupport::NumberHelper.number_to_currency(2_500_000.61, unit: '€', precision: 2, separator: ',', delimiter: '', format: "%n%u")

다음과 같은 출력물을 줄 수 있다.

2500000,61€

[Number_to_currency] 의 확인란 다른 '옵션' (https://apidock.com/rails/ActionView/Helpers/NumberHelper/number_to_currency) 미접촉 t 세포.

여기서 것을

도우미, 이를 사용하여 δ1 보기를 원하는 만큼 애플리케이션과는 넣을 수 있습니다.

module ApplicationHelper    
  def format_currency(amount)
    number_to_currency(amount, unit: '€', precision: 2, separator: ',', delimiter: '', format: "%n%u")
  end
end
넣을 수 있고 '항목' 모델 인스턴스로 방법 및 it 호출하십시오 필요한 곳에 포맷하십시오 가격 (보거나 알고 있는).

class Item < ActiveRecord::Base
  def format_price
    number_to_currency(price, unit: '€', precision: 2, separator: ',', delimiter: '', format: "%n%u")
  end
end
그리고, 예를 들어 '내가 어떻게 list. number_to_currency 콘트로러 안에' (',' 옵션을 나타내는 데 사용되는 것을 negative_format 환불)

def refund_information
  amount_formatted = 
    ActionController::Base.helpers.number_to_currency(@refund.amount, negative_format: '(%u%n)')
  {
    # ...
    amount_formatted: amount_formatted,
    # ...
  }
end

저의 기본 api 를 사용하여 표현할 수 있었으나 모두 센트, 쉐퍼드도 didn& # 39, 변화시킬 수 있는 돈을 된 것입니다. 내가 작업하는 도읍을 많은 양의 돈을 벌었다. 그래서 그냥 이거 받을시간은 도우미 방법:

sprintf("%03d", amount).insert(-3, ".")

정수 문자열로 변환하는 통해 적어도 세 자리 (추가 주요 제로는 필요한 경우) 한 후 마지막 두 자리, 부동 소수점 삽입물의 전에 'a' 로 사용할 수 없습니다. 여기에서 통화화 심볼에는 적합한지 览侩 荤례 있는모든 추가할 수 있습니다.

, Quick and dirty, 하지만 가끔 it& # 39 의 말해둘꼐요 that& # 39, s just fine!

Brent Royal-Gordon
Code-MonKy
그는 3년 전 댓글을 달았습니다
0

39, t believe 아니예 can& 업보테드 있습니다. 이는 내 돈을 얻을 수 있는 유일한 심아이엔큐 협력했습니다 아주 잘 객체에는 붙여넣습니다 양식 등 API 를 로봇이잖아 (소수)

일부 number_to_currency 전달할 수 있습니다 '옵션' (표준 레일 4 보기입니다 helper):

number_to_currency(12.0, :precision => 2)
# => "$12.00"

올린 것처럼 딜런 마르코프

  • 간단한 코드를 루비 &amp. 레일 *

<%= number_to_currency(1234567890.50) %>

OUT PUT => $1,234,567,890.50