답변:
DECIMAL
데이터베이스에서 유형 을 사용하고 싶을 것입니다 . 마이그레이션 할 때 다음과 같이하십시오.
# 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
Rails에서는 :decimal
유형이로 반환되어 BigDecimal
가격 계산에 좋습니다.
정수 사용을 고집한다면 BigDecimal
어디에서나 수동으로 변환해야하며 아마도 고통이 될 것입니다.
mcl에서 지적했듯이 가격을 인쇄하려면 다음을 사용하십시오.
number_to_currency(price, :unit => "€")
#=> €1,234.01
다음은 composed_of
(ValueObject 패턴을 사용하여 ActiveRecord의 일부) 및 Money 보석 을 활용하는 훌륭하고 간단한 접근법입니다.
너는 필요할거야
Product
integer
예를 들어 모델 및 데이터베이스 의 열:price
이것을 product.rb
파일에 작성 하십시오.
class Product > ActiveRecord::Base
composed_of :price,
:class_name => 'Money',
:mapping => %w(price cents),
:converter => Proc.new { |value| Money.new(value) }
# ...
당신이 얻을 것 :
product.price = "$12.00"
Money 클래스로 자동 변환product.price.to_s
십진수 형식의 숫자를 표시합니다 ( "1234.00")product.price.format
통화에 대해 올바른 형식의 문자열을 표시합니다product.price.cents.to_s
통화를 처리하는 일반적인 방법은 10 진수 형식을 사용하는 것입니다. 다음은 "Agile Web Development with Rails"의 간단한 예입니다.
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
당신의 가치를 확인하십시오.
머니 레일 보석을 사용하십시오 . 모델의 돈과 통화를 잘 처리하고 가격을 형식화하는 데 많은 도우미가 있습니다.
RoR 개발에서 주목받는 주니어 / 초보자에 대한 모든 답변의 약간의 업데이트와 응집력이 설명을 위해 여기에 올 것입니다.
:decimal
@molf가 제안한 것처럼 돈을 DB에 저장하는 데 사용하십시오 (그리고 돈으로 작업 할 때 회사가 황금 표준으로 사용하는 것).
# 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
몇 가지 점 :
:decimal
BigDecimal
많은 문제를 해결하는 데 사용될 것 입니다.
precision
그리고 scale
당신이 대표하는 내용에 따라 조정되어야한다
귀하가 지불을 받고 송금 하는 데 가장 많은 돈 precision: 8
을 scale: 2
주면 999,999.99
90 %의 경우에 해당합니다.
부동산이나 희귀 자동차의 가치를 나타내려면 더 높은 값을 사용해야합니다 precision
.
좌표 (경도 및 위도)로 작업하는 경우 반드시 더 높아야 scale
합니다.
위 내용으로 마이그레이션을 생성하려면 터미널에서 실행하십시오.
bin/rails g migration AddPriceToItems price:decimal{8-2}
또는
bin/rails g migration AddPriceToItems 'price:decimal{5,2}'
이 블로그 게시물에 설명 된대로 .
KISS 추가 라이브러리가 작별 인사를하고 사용이 내장 된 헬퍼. number_to_currency
@molf 및 @facundofarias 제안으로 사용하십시오 .
number_to_currency
Rails 콘솔에서 도우미 와 함께 플레이하려면 도우미에 액세스하기 위해 ActiveSupport
의 NumberHelper
클래스에 전화를 보냅니다 .
예를 들면 다음과 같습니다.
ActiveSupport::NumberHelper.number_to_currency(2_500_000.61, unit: '€', precision: 2, separator: ',', delimiter: '', format: "%n%u")
다음과 같은 출력을 제공합니다
2500000,61€
number_to_currency 도우미 중 다른 options
것을 확인하십시오 .
응용 프로그램 헬퍼에 넣고 어느 정도의 뷰 내에서 사용할 수 있습니다.
module ApplicationHelper
def format_currency(amount)
number_to_currency(amount, unit: '€', precision: 2, separator: ',', delimiter: '', format: "%n%u")
end
end
또는 Item
모델에 인스턴스 메소드로 모델을 넣고 가격을 형식화해야하는 위치 (뷰 또는 헬퍼)로 호출 할 수 있습니다.
class Item < ActiveRecord::Base
def format_price
number_to_currency(price, unit: '€', precision: 2, separator: ',', delimiter: '', format: "%n%u")
end
end
그리고 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
사용 (Railscast) (지불 개정 된에 링크) 가상 속성을 당신이 정수 컬럼에 price_in_cents을 저장하고 getter 및 setter 같은 제품 모델에 가상 속성 price_in_dollars을 추가 할 수 있습니다.
# 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
출처 : RailsCasts # 016 : 가상 속성 : 가상 속성은 데이터베이스에 직접 매핑되지 않는 양식 필드를 추가하는 깔끔한 방법입니다. 여기에서는 유효성 검사, 연결 등을 처리하는 방법을 보여줍니다.
내 기본 API는 모두 돈을 나타내는 데 센트를 사용하고 있었고 변경하고 싶지 않았습니다. 나는 많은 돈을 가지고 일하지도 않았습니다. 그래서 나는 이것을 도우미 메소드에 넣었습니다.
sprintf("%03d", amount).insert(-3, ".")
정수를 3 자리 이상의 문자열로 변환하고 (필요한 경우 앞에 0을 추가) 마지막 두 자리 앞에 소수점을 삽입하고 결코 사용하지 않습니다 Float
. 여기에서 사용 사례에 적합한 통화 기호를 추가 할 수 있습니다.
그것은이다 확실히 하지만 때로는 그의 잘, 신속하고 더러운!
나는 이런 식으로 사용하고 있습니다 :
number_to_currency(amount, unit: '€', precision: 2, format: "%u %n")
물론 통화 기호, 정밀도, 형식 등은 각 통화에 따라 다릅니다.
몇 가지 옵션을 number_to_currency
표준 Rails 4 뷰 도우미로 전달할 수 있습니다 .
number_to_currency(12.0, :precision => 2)
# => "$12.00"
DECIMAL(19, 4)
인기있는 선택입니다 확인 이 또한 확인 여기에 , 희망이 도움이 얼마나 많은 소수점 사용에 장소를 결정하는 세계 외화 형식.