Это не может быть однозначного ответа на ваш вопрос (I 'm не Scala coder), но я думаю, что это будет полезно в любом случае в сочетании с другими ответами и комментариями.
Вы заставили меня думать о создании регулярного выражения, чтобы идентифицировать только только денежные суммы, игнорируя другие цифры. Это то, что я придумал:
([$£€¥₹])?(\d{1,3}(?:[, ]?\d{1,3})?(?:.\d+)?)(?(1)|(kr\.?|Kč))
Этот пример обрабатывает сумм, заранее фиксируемых с признаками за доллары $
, GB Фунты £
, Евро €
, японская йена (? Или Китаев юань()) ¥
или индийских рупиях ₹
.
Он также обрабатывает валюты с символом «фиксированной» валюты с фиксированной валютой. В примере шведский/датский/норвежский кронор kr
и чешский koruna Kč
.
Сумма всегда фиксируется в группе захвата 2. Префикс валюты обозначен в группе 1, а по умолчанию - в группе 3. (Я понял - какая польза от суммы, если вы не знаете валюту.)
See it here at regex101, обработка этот текст:
Стоимость этого автомобиля с 3,5-литровым двигателем, является € 2,927.100, или $ 3 271,32. В Швеции это будет около 27000кр. Мне пришлось бы работать сверхурочно в течение 215 дней, чтобы сэкономить на этом деньги, хотя моя работа в Чехии платит 436,5 тыс. Ч в час, и я могу сэкономить 10%. Мой приятель в Японии купил один за ¥ 357014,83.
Он начинается с соответствия необязательного знака валюты. Затем он сопоставляет сумму, которая может быть отформатирована как любая из ###
, ##,###
, ##,###,###.###
. После этого он использует условие регулярного выражения - если совпадал исходный символ валюты, он ничего не соответствует -> done. Если он не был сопоставлен, он проверяет типы фиксированных валют.
Код (стрельба от бедра здесь - нет Scala опыт, что так всегда, просто "Googler"):
val value = "\nValue is €2,927"
val pattern = "([$£€¥₹])?(\\d{1,3}(?:[, ]?\\d{1,3})?(?:.\\d+)?)(?(1)|(kr\\.?|Kč))".r
val pattern(c1, amnt, c2) = value
// remove spaces and thousands-separators from the value
val str = amnt.replaceAll("[ ,]", "")
// convert it to an integer and/or double.
val i = str.toInt
val d = str.toDouble
Редактировать
Wow! Это было сложно взломать. Теперь я узнал, что java regex не поддерживает конструкции if-else
. Так вот альтернатива, немного более сложная альтернатива:
(?=[$£€¥₹])(.)(\d{1,3}(?:,\d{3})?(?:\.\\d+)?)|(\d{1,3}(?:,\d{3})?(?:\.\d+)?)(kr\.?|Kč)
Он использует положительный смотреть вперед, чтобы определить, является ли это заранее фиксирован, или пост-фиксированный символ валюты. Фактический захват объема должен был быть разделен на две группы в зависимости от pre или сообщение. Таким образом, либо валюта находится в первой группе, либо в сумме в 2, или в сумме в 3 и валюте в 4.
And see functioning ;) code here at ideone.
Edit # 2
Некоторые новые валюты и прочее добавлены после комментария.
(Rs.|[$£€¥₹])?\s*(\d{1,3}(?:[, ]?\d{1,3})?(?:.\d+)?)(?(1)|\s*(kr\.?|Kč|INR|€))
Here at regex101.
Что делать, если значение «Value is € 2,927.99'? Обратите внимание, что 'd {5}' просто соответствует 5 буквам 'd'. Является ли значение валюты всегда первым значением int/float, которое вы хотите извлечь? –
Или худшее: 'Значение - € 2 972.99, спасибо. –
Мне нужно использовать Regex с этим? (может у меня есть пример кода?) –