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

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

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

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

질문에 대한 의견 (1)
해결책

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
해설 (13)

일반적인 방법은 취급료 통화화 사용하는 소수 유형:. 다음은 간단한 예를 통해, 애자일 웹 개발 함께 &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 

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

해설 (2)

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

해설 (2)

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

add_column :products, :price, :money, default: 0
해설 (0)

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 표시

해설 (1)

말해둘꼐요 정수.

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

해설 (0)

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

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

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

해설 (0)

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

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

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

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

해설 (0)

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

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

올린 것처럼 딜런 마르코프

해설 (0)

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

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
해설 (0)

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

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

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

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

해설 (1)
  • 간단한 코드를 루비 &amp. 레일 *


OUT PUT => $1,234,567,890.50
해설 (0)