ruby Unidad de Fomento(CLF/UF)and money gem

qgelzfjb  于 2023-08-04  发布在  Ruby
关注(0)|答案(3)|浏览(137)

我一直在努力理解money gem如何格式化Unidad de Fomento。我已经测试了6.56.7版本,两者似乎都呈现奇怪的格式:

# Money 6.5

usd = Money.new(243, 'USD')
usd.to_f #=> 2.43
usd.format #=> "$2.43"

clf = Money.new(243, 'CLF')
clf.to_f #=> 243
clf.format #=> "CLF243"

# Money 6.7

usd = Money.new(243, 'USD')
usd.to_f #=> 2.43
usd.format #=> "$2.43"

clf = Money.new(243, 'CLF')
clf.to_f #=> 0.0243
clf.format #=> "CLF0.0243"

字符串
这是注定的,还是一个bug?

lkaoscv7

lkaoscv71#

这是在6.6版本中引入的故意更改。查看GitHub上的changelogcommit。不幸的是,没有任何线索说明为什么这样做。

r9f1avp5

r9f1avp52#

好的,我想我明白了。我是一个傻瓜,认为我们生活在一个像美元或欧元这样的美分世界(以10为基数的指数2,10^2 cents等于1个货币单位)。有许多货币没有任何类型的次要货币,如日元(JPY),也有货币没有基地10。维基百科上的这篇文章解释得很好:https://en.wikipedia.org/wiki/ISO_4217
所以,在我的例子中,似乎很久以前CLF是一种指数为0的货币,所以它没有任何类型的次要货币。2.34是一个无效的金额,因此money将其转换为234。ISO改变了,然后CLF被转换成指数为4的货币。
关于money问题跟踪器的这条评论解决了我的问题:https://github.com/RubyMoney/money/issues/614#issuecomment-194813943

c86crjj0

c86crjj03#

货币>= 6.6:

currency_id = "CLF"
subunits = Money::Currency.new(currency_id).subunit_to_unit
clf = Money.new(243 * subunits, currency_id)
clf.format #=> "UF243.0000"

字符串

相关问题