source

통화/화폐를 다루는 가장 좋은 방법은 무엇입니까?

manysource 2023. 7. 4. 21:59

통화/화폐를 다루는 가장 좋은 방법은 무엇입니까?

저는 매우 기본적인 쇼핑 카트 시스템을 개발하고 있습니다.

이 .items이 열이있인 priceinteger.

유로와 센트를 모두 포함한 가격에 대해 제 견해에 가격 가치를 표시하는 데 어려움을 겪고 있습니다.레일즈 프레임워크의 통화 처리와 관련하여 제가 분명히 누락한 것이 있습니까?

다을사수있다니습할용음을 입니다.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로 ActiveSupportNumberHelper클래스에 액세스할 수 있습니다.

예:

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

다음과 같은 출력을 제공합니다.

2500000,61€

하나를 합니다.optionsnumber_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