2013-12-24 2 views
0

я получаю следующие валюты в процессе импорта:Разбираем отрицательные валюты с скобкой

$22.21 

($55.95) 

я могу сделать Money.parse('$22.21') для разбора в RubyMoney объекта.

Однако, как я могу разобрать ($55.95) в отрицательный объект RubyMoney? Нужно ли сначала разобрать его на отрицательное число, а затем на объект RubyMoney? Это похоже на общий запрос, но я не могу найти что-либо с помощью поиска по какой-то странной причине.

Если я получу -$55.95, тогда я могу запустить Money.parse('-$55.95'). Бонусные баллы, если метод может обрабатывать как положительные, так и отрицательные валюты.

ответ

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" 
+0

В зависимости от того, насколько хорошо сформированы данные, вы можете добавить знак $ для защиты от меньшего размера. – griotspeak

+1

Или проще, если вы считаете, что формат - это деньги: 'str.gsub (/^(\(.*\))$/, '- \ 1')' или что-то в этом роде. ;) – lurker

+0

Хороший вызов @mbratch - мое регулярное выражение не настолько твердое. :) – CDub

0

Сначала вы можете delete скобки и затем разобрать

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

Money.parse(money) 

Это в ридми из RubyMoney sign_before_symbol

Почему вы не используете number_to_currency?

+0

Вы должны сделать свой ответ более понятным и полезным. Вы ссылаетесь на «': negative_format' - задает формат для отрицательных чисел (по умолчанию добавляется дефис к отформатированному номеру, заданному: format). Принимает те же поля, что: формат, кроме% n здесь абсолютное значение номер." – griotspeak

+0

Обновлен мой ответ, что код Ruby должен делать трюк. – swapab

2

со страницы, которая @swapnilabnave linked to:

:negative_format - Устанавливает формат для отрицательных чисел (по умолчанию предваряя дефисом на отформатированный номер задается: формат). Принимает те же поля, что: формат, кроме% n здесь абсолютное значение числа.

Таким образом, вы должны использовать (%u%n) для желаемого эффекта.

Смежные вопросы