통화/화폐를 다루는 가장 좋은 방법은 무엇입니까?
저는 매우 기본적인 쇼핑 카트 시스템을 개발하고 있습니다.
이 .items
이 열이있인 price
integer
.
유로와 센트를 모두 포함한 가격에 대해 제 견해에 가격 가치를 표시하는 데 어려움을 겪고 있습니다.레일즈 프레임워크의 통화 처리와 관련하여 제가 분명히 누락한 것이 있습니까?
다을사수있다니습할용음을 입니다.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
레즈에서일,,:decimal
은 type 됩니다.BigDecimal
가격 계산에 아주 좋습니다.
정수를 사용해야 하는 경우 수동으로 변환해야 합니다.BigDecimal
모든 곳에 있는 s, 그것은 아마도 고통이 될 것입니다.
MCL이 지적한 대로 가격을 인쇄하려면 다음을 사용합니다.
number_to_currency(price, :unit => "€")
#=> €1,234.01
이를 활용하는 멋지고 간단한 접근 방식은 다음과 같습니다.composed_of
, 패턴 ) 및 (ValueObject 패 ActiveRecord 및 MoneyGem)
필요할 것입니다.
- 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
의 숫자를 합니다.product.price.format
" "에 대한 올바른 합니다.- 이 (원하는 를 보내야 ,
product.price.cents.to_s
- 무료 통화 변환
통화를 다루는 일반적인 방법은 십진법을 사용하는 것입니다.다음은 "레일을 통한 신속한 웹 개발"의 간단한 예입니다.
add_column :products, :price, :decimal, :precision => 8, :scale => 2
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}'
이 블로그 게시물에서 설명한 바와 같이.
통화 형식
추가 라이브러리에 작별 키스를 하고 내장 도우미를 사용합니다.사용하다number_to_currency
@molf와 @facundofarias 안한것처럼제가것▁@처.
가지고 놀기number_to_currency
in Rails Rails로 ActiveSupport
의NumberHelper
클래스에 액세스할 수 있습니다.
예:
ActiveSupport::NumberHelper.number_to_currency(2_500_000.61, unit: '€', precision: 2, separator: ',', delimiter: '', format: "%n%u")
다음과 같은 출력을 제공합니다.
2500000,61€
하나를 합니다.options
number_to_helper의.
어디에 둘 곳
응용프로그램 도우미에 저장하고 보기 내에서 원하는 양으로 사용할 수 있습니다.
module ApplicationHelper
def format_currency(amount)
number_to_currency(amount, unit: '€', precision: 2, separator: ',', delimiter: '', format: "%n%u")
end
end
아니면 당신은 그것을 그것에 넣을 수 있습니다.Item
인스턴스(instance) 메서드로 모델링하고 가격 형식을 지정해야 하는 위치에 호출합니다(뷰 또는 도우미).
class Item < ActiveRecord::Base
def format_price
number_to_currency(price, unit: '€', precision: 2, separator: ',', delimiter: '', format: "%n%u")
end
end
에용▁▁i를 사용하는 방법에 대한 예를 들어보겠습니다.number_to_currency
("(내▁a▁inside부▁the)내부▁contr"negative_format
데 ), 나션을타, 는데내사용됨옵환불데)
def refund_information
amount_formatted =
ActionController::Base.helpers.number_to_currency(@refund.amount, negative_format: '(%u%n)')
{
# ...
amount_formatted: amount_formatted,
# ...
}
end
Postgres를 사용하고 (지금 에) 은 그들의 "Postgres"를 싶을 입니다.:money
열 유형 시도.
add_column :products, :price, :money, default: 0
돈줄 보석을 사용하세요.그것은 당신의 모델에 있는 화폐와 통화를 잘 처리하고 당신의 가격을 포맷할 수 있는 많은 조력자들을 가지고 있습니다.
가상 특성(개정된(유료) 레일캐스트에 대한 링크)을 사용하여 price_in_cents를 정수 열에 저장하고 제품 모델에 가상 특성 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: 가상 속성:가상 속성은 데이터베이스에 직접 매핑되지 않는 양식 필드를 추가하는 깔끔한 방법입니다. 여기에서는 검증, 연결 등을 처리하는 방법을 보여 줍니다.
확실히 정수입니다.
Decimal은 말하면 하지만,1.5
여전히 루비의 순수한 플로트를 줄 겁니다
누군가 Sufficient를 사용하는 경우 마이그레이션은 다음과 같습니다.
add_column :products, :price, "decimal(8,2)"
어떻게든 후속편은 무시합니다: 정밀도와 :척도.
(속편 버전: 속편 (3.39.0, 3.38.0)
저의 기본 API들은 모두 돈을 표현하기 위해 센트를 사용했습니다. 그리고 저는 그것을 바꾸고 싶지 않았습니다.저는 또한 많은 돈을 가지고 일하지 않았습니다.그래서 저는 이것을 도우미 방법으로 넣었습니다.
sprintf("%03d", amount).insert(-3, ".")
가 최소 세의 숫자( 0 를 가진 로 변환한 두 앞에 로 " " " " " " " " " ( " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " "Float
여기에서 사용 사례에 적합한 통화 기호를 추가할 수 있습니다.
확실히 빠르고 더럽지만 가끔은 괜찮아요!
다음과 같은 방식으로 사용합니다.
number_to_currency(amount, unit: '€', precision: 2, format: "%u %n")
물론 통화 기호, 정확도, 형식 등은 각각의 통화에 따라 다릅니다.
다음으로 일부 옵션을 전달할 수 있습니다.number_to_currency
4 뷰 도우미Rails 4 뷰 도우미):
number_to_currency(12.0, :precision => 2)
# => "$12.00"
루비 & 레일즈의 간단한 코드
<%= number_to_currency(1234567890.50) %>
OUT PUT => $1,234,567,890.50
언급URL : https://stackoverflow.com/questions/1019939/what-is-the-best-method-of-handling-currency-money
'source' 카테고리의 다른 글
Oracle PL/SQL - NO_DATA_Found 예외가 저장 프로시저 성능에 좋지 않습니까? (0) | 2023.07.04 |
---|---|
Vuex 작업: 다른 작업 내의 작업 액세스(디스패치 없음, Promise.all을 연결해야 함) (0) | 2023.07.04 |
oradiag_폴더란 무엇입니까? (0) | 2023.07.04 |
"git init"과 "git init --bare"의 차이점은 무엇입니까? (0) | 2023.06.29 |
.NET Guid를 MongoDB 개체로 변환아이디 (0) | 2023.06.29 |