2016-02-23 1 views
-1

Я пытаюсь заменить некоторые строки скобками на отрицательные числа:Замена (12345) отрицательным

например. "(12345)" станет "-12345" "(1,23)" станет "-1,23" "(1,55)" станет "-1,55"

Это то, что я пробовал:

amount = value[sum.to_sym].gsub /\((.+)\)/ , "-#$1" 

, но в некоторых случаях он возвращает «-», например «(59006)»

Есть ли лучший способ сделать это

ответ

4

Проблема заключается в вашем шаблоне замещения, а не в вашем регулярном выражении. Строчная интерполяция "-#$1" (сокращение от "-#{$1}") оценивается до вызова gsub, поэтому ваш шаблон замены - это то, что было $ 1 во время разговора до gsub.

Вы можете это исправить, выполнив

gsub /\((.+)\)/ , "-\\1" 

где \ 1 обозначает первую группу захвата или с помощью формы блока

gsub(/\((.+)\)/) { "-#$1" } 

Если производительность критически второй, вероятно, медленнее, так как GSUB имеет для вызова блока, но маловероятно, чтобы сделать разницу

1

Ваше регулярное выражение прекрасно. Используйте скобки или \1

"(59,006.23)".gsub(/\((.+)\)/){"-#$1"} #=> "-59,006.23" 
"(59,006.23)".gsub(/\((.+)\)/,'-\1') #=> "-59,006.23" 

Проблему с текущим кодом это дает "-#$1" в качестве аргумента gsub. В этот момент 1 доллар еще не обновлен и, следовательно, сохраняет значение вашего последнего матча. (Попробуйте выполнить некоторое сопоставление регулярных выражений до gsub, и вы увидите, что я говорю)

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