Лучший способ удалить тысячи разделителей из суммы строки с помощью регулярного выражения

У меня есть переменные, содержащие суммы, и я хотел бы удалить разделители тысяч (США), но также должен учитывать сценарий, в котором могут быть суммы, отформатированные не в США, где запятая используется для десятичных знаков, а не для тысяч, где я не не хочу заменить запятую.

Примеры:

  • 1 234 567,00 должно стать 1 234 567,00.
  • 1234,00 должно стать 1234,00
    но
  • 1.234.567,00 необходимо оставить без изменений, так как формат не США (т.е. запятая здесь используется для десятичных знаков)
  • 1.234,00 необходимо оставить без изменений, так как это не американский формат (т. е. запятая здесь используется для десятичных знаков)

Я думал об использовании следующего, но не был уверен в этом, так как я новичок в Regex:

myVar.replace(/(\d+),(?=\d{3}(\D|$))/g, "$1");

Какое здесь лучшее решение? Примечание. Мне просто нужно покрыть обычные суммы, такие как приведенные выше примеры, никаких особых случаев, таких как комбинации букв и цифр или такие вещи, как 1,2,3 и т. д.


person user2571510    schedule 24.11.2014    source источник
comment
Всегда ли у вас будет 2 десятичных знака? Если нет, то вы никогда не узнаете, является ли 1234 1000 + 234 или 1 + 0,234.   -  person tomdemuyt    schedule 24.11.2014
comment
Спасибо - да, буду.   -  person user2571510    schedule 24.11.2014
comment
для меня это сработало: ,(?=\d{3})   -  person Julian    schedule 07.06.2017


Ответы (5)


Это может удовлетворить ваши потребности:

,(?=[\d,]*\.\d{2}\b)

Визуализация регулярных выражений

Демонстрация отладки

person sp00m    schedule 24.11.2014
comment
Спасибо за это - не нужно ли мне обернуть это в / / g, чтобы охватить все экземпляры разделителей тысяч? - person user2571510; 24.11.2014
comment
спасибо за веб-сайт Debuggex Demo, никогда не видел его раньше, действительно отличный сайт с графиком. - person albanx; 24.11.2014
comment
@ user2571510 Да, вам нужно включить флаг global: /theregex/g. - person sp00m; 24.11.2014
comment
Спасибо, все - это работает очень хорошо, и мне нравится изображение рабочего процесса. - person user2571510; 24.11.2014

Заменить /,(?=\d*[\.,])/g пустой строкой?

http://regexr.com/39v2m

person Sam Greenhalgh    schedule 24.11.2014
comment
Спасибо и за это! Я пытаюсь понять, что здесь имеет для меня наибольший смысл. - person user2571510; 24.11.2014

myVar = myVar.replace(/([.,])(\d\d\d\D|\d\d\d$)/g,'$2');

Удаляет период. или запятая при использовании в качестве разделителя тысяч.

person JohnP2    schedule 05.12.2015

Вы можете использовать метод replace(), чтобы удалить все запятые. Они будут заменены пустой строкой. Я использую reg exp с предварительным утверждением, чтобы определить, следует ли за запятой три цифры, если да, то данная запятая будет удалена.

string.replace(/,(?=\d{3})/g, '')

Примеры:

'12,345,678.90'.replace(/,(?=\d{3})/g, '')
// '12345678.90'

'1,23,456.78'.replace(/,(?=\d{3})/g, '')
// '1,23456.78'

'$1,234.56'.replace(/,(?=\d{3})/g, '')
// '$1234.56'
person user3812733    schedule 23.05.2020

person    schedule
comment
Спасибо - я бы хотел избежать использования здесь операторов IF. - person user2571510; 24.11.2014