통화 / 돈을 처리하는 가장 좋은 방법은 무엇입니까?
저는 매우 기본적인 쇼핑 카트 시스템을 만들고 있습니다.
유형 items
의 열 이있는 테이블 이 있습니다 .price
integer
유로와 센트가 모두 포함 된 가격에 대한 견해에 가격 값을 표시하는 데 문제가 있습니다. Rails 프레임 워크에서 통화를 다루는 한 명백한 것을 놓치고 있습니까?
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 gem 을 활용하는 훌륭하고 간단한 접근법입니다.
너는 필요할거야
- 돈 보석 (버전 4.1.0)
- 예를 들어 모델
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) }
# ...
당신이 얻을 것 :
- 추가로 변경하지 않으면 모든 양식에 달러와 센트가 표시되지만 내부 표현은 여전히 센트입니다. 이 양식은 "$ 12,034.95"와 같은 값을 수락하여 변환합니다. 모델 또는 뷰의 도우미에 추가 처리기 또는 특성을 추가 할 필요가 없습니다.
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
당신의 가치를 확인하십시오.
머니 레일 보석을 사용하십시오 . 모델의 돈과 통화를 잘 처리하고 가격을 형식화하는 데 많은 도우미가 있습니다.
Postgres를 사용하고 있다면 (2017 년부터) :money
열 유형을 시험해 볼 수 있습니다.
add_column :products, :price, :money, default: 0
사용 (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 : 가상 속성 : 가상 속성은 데이터베이스에 직접 매핑되지 않는 양식 필드를 추가하는 깔끔한 방법입니다. 여기에서는 유효성 검사, 연결 등을 처리하는 방법을 보여줍니다.
확실히 정수 입니다.
BigDecimal은 기술적으로 존재하지만 1.5
루비에서 순수한 Float를 제공합니다.
누군가 Sequel을 사용하는 경우 마이그레이션은 다음과 같습니다.
add_column :products, :price, "decimal(8,2)"
어떻게 든 Sequel은 : precision과 : scale을 무시한다
(후편 버전 : 속편 (3.39.0, 3.38.0))
나는 이런 식으로 사용하고 있습니다 :
number_to_currency(amount, unit: '€', precision: 2, format: "%u %n")
물론 통화 기호, 정밀도, 형식 등은 각 통화에 따라 다릅니다.
몇 가지 옵션을 number_to_currency
표준 Rails 4 뷰 도우미로 전달할 수 있습니다 .
number_to_currency(12.0, :precision => 2)
# => "$12.00"
내 기본 API는 모두 돈을 나타내는 데 센트를 사용하고 있었고 변경하고 싶지 않았습니다. 나는 많은 돈을 가지고 일하지도 않았습니다. 그래서 나는 이것을 도우미 메소드에 넣었습니다.
sprintf("%03d", amount).insert(-3, ".")
정수를 3 자리 이상의 문자열로 변환하고 (필요한 경우 앞에 0을 추가) 마지막 두 자리 앞에 소수점을 삽입하고 결코 사용하지 않습니다 Float
. 여기에서 사용 사례에 적합한 통화 기호를 추가 할 수 있습니다.
그것은이다 확실히 하지만 때로는 그의 잘, 신속하고 더러운!
Ruby & Rails를위한 간단한 코드
<%= number_to_currency(1234567890.50) %>
OUT PUT => $1,234,567,890.50
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
참고 URL : https://stackoverflow.com/questions/1019939/what-is-the-best-method-of-handling-currency-money
'Programing' 카테고리의 다른 글
모노는 프라임 타임 준비가 되셨습니까? (0) | 2020.03.09 |
---|---|
별도의 AngularJS 컨트롤러 파일을 만드는 방법은 무엇입니까? (0) | 2020.03.09 |
JavaScript에서 동적 변수 이름 사용 (0) | 2020.03.09 |
INT에서 VARCHAR SQL로 변환 (0) | 2020.03.09 |
WPF TextBlock의 자동 세로 스크롤 막대? (0) | 2020.03.09 |