新手问题 货币格式问题,integer 转成:小数,带千分位,有更优雅的吗?

jmmbite · 2018年07月18日 · 最后由 torvaldsdb 回复于 2018年07月24日 · 3125 次阅读
7777777.to_s.rjust(3, '0').gsub(/(\d{2})$/, '.\1').gsub( /(^|\s)(\d+)(\d{2})/ ){|x| x.gsub(/(?=(?!\b)(\d{3})+$)/, ',')} 

number_to_currency

victor 回复

这个好像只能在 views 使用,controllers 不能使用,需要在 notice 等提示中使用。

也可以在非 view 的地方使用

ActionController::Base.helpers.number_to_currency 7777777

可以先 include ActiveSupport::NumberHelper

你需要的是 money

Ps:如果处理国际货币的话,很多货币是没有小数位的,或者小数位只有 1 位,比如円

dddd1919 回复

rubymoney,也考虑用过,最后花了点时间,给 number_to_currency 加了一层来处理。

本着能不用 gem 尽量不用的原则。各项配置能入库一律入库。

currencies 和 number_to_currency 的各项参数,每一种货币的配置写入数据库。

增加了一个 cents 参数:

1 单位的货币 = 多少 cents,

积分的话:1 unit = 1cents

人民币:1 unit = 100 cents

最后配合:precision 参数,基本没差别了

def money(credit, currency)
  number_to_currency(
    credit*1.0/currency.cents, unit: currency.unit, 
    delimiter: currency.delimiter, separator: currency.separator, precision: currency.precision, 
    format: currency.format, 
  )
end

# or

def money(credit, currency)
  number_to_currency( credit*1.0/currency.cents, currency.attributes )
end

# use helper
2.3.3 (main):0 > helper.number_to_currency 7777777
=> "¥ 7,777,777.00"
# active_support
2.3.3 (main):0 > 7777777.to_s(:currency)
=> "¥ 7,777,777.00"
# include precision
2.3.3 (main):0 > 7777777.to_s(:currency, precision: 3)
=> "¥ 7,777,777.000"

这样造轮子不浪费生命么

jmmbite 回复

我是在 ActiveSupport 扩展里面看到的,想请教一下,你是怎么定位源码的位置的?

jmmbite 回复

啊哈,以为有什么暗黑高科技

需要 登录 后方可回复, 如果你还没有账号请 注册新账号