用括号解析负货币

时间:2013-12-24 19:44:07

标签: ruby-on-rails ruby-on-rails-3

我在导入过程中获得以下货币:

$22.21

($55.95)

我可以Money.parse('$22.21')解析成RubyMoney个对象。

但是,如何将($55.95)解析为否定的RubyMoney对象?我是否需要先将其解析为负数然后再解析为RubyMoney对象?这似乎是一个常见的请求,但我找不到任何东西,通过搜索一些奇怪的原因。

如果我获得-$55.95,我就可以在其上运行Money.parse('-$55.95')。如果该方法可以处理正负货币,则可以获得奖励。

3 个答案:

答案 0 :(得分:2)

来自@swapnilabnave linked to:

的网页

:negative_format - 设置负数的格式(默认为将连字符添加到格式化的数字,格式为:format)。接受与以下相同的字段:格式,除了%n在这里是数字的绝对值。

因此,您可以使用(%u%n)获得所需的效果。

答案 1 :(得分:0)

您可以使用正则表达式查看字符串是否包含括号。如果是,请删除它们,并在前面添加一个负号:

str.include?(")") ? str.gsub(/\(|\)/, "").insert(0, "-") : str

示例:

2.0.0p247 :013 > str = "($55.95)"
 => "($55.95)" 

2.0.0p247 :014 > str.include?(")") ? str.gsub(/\(|\)/, "").insert(0, "-") : str
 => "-$55.95" 

这也适用于正值:

2.0.0p247 :016 > str = "$55.95"
 => "$55.95" 

2.0.0p247 :017 > str.include?(")") ? str.gsub(/\(|\)/, "").insert(0, "-") : str
 => "$55.95" 

答案 2 :(得分:0)

首先,您可以delete括号,然后解析

money = "($55.95)"
money = money.delete!('()') and "-#{money}" or money

Money.parse(money)

这是RubyMoney的自述文件sign_before_symbol

为什么不使用number_to_currency