2016-06-01 2 views
0

Так у меня есть эта строка:Получить сумму из строки, используя дающий Regex

val value = "\nValue is €2,927" 

Как я могу разобрать эту сумму 2927, из любой валюты, и преобразовать его в double/int?

Это то, что я есть попробовать:

println(value.replaceAll("d{5}", "")) 

Edit:

может быть любой знак валюты.

+0

Что делать, если значение «Value is € 2,927.99'? Обратите внимание, что 'd {5}' просто соответствует 5 буквам 'd'. Является ли значение валюты всегда первым значением int/float, которое вы хотите извлечь? –

+0

Или худшее: 'Значение - € 2 972.99, спасибо. –

+0

Мне нужно использовать Regex с этим? (может у меня есть пример кода?) –

ответ

0

У вас может быть аналогичное решение из моего моего ответа here. Итак:

scala> import scala.util.matching.Regex 
import scala.util.matching.Regex 

scala> val matcher = new Regex("\\d{1,1}") 
matcher: scala.util.matching.Regex = \d{1,1} 

scala> val value = "\nValue is €2,927" 
value: String = 
" 
Value is €2,927" 

scala> matcher.findAllMatchIn(value).toList.mkString.toInt 
res1: Int = 2927 

EDIT: Если вместить двойники ...

scala> val value = "\nValue is €2,927.545" 
value: String = 
" 
Value is €2,927.545" 

scala> val matcher = new Regex("\\d{1,3}[\\.\\,\\ ]?[0-9]$*") 
matcher: scala.util.matching.Regex = \d{1,3}[\.\,\ ]?[0-9]$* 
scala> matcher.findAllMatchIn(value).toList.mkString.replaceAll("[ ,]", "").toDouble 
res7: Double = 2927.545 

И для пространств ...

scala> val value = "\nValue is €2 927, 927.545" 
value: String = 
" 
Value is €2 927, 927.545" 

scala> matcher.findAllMatchIn(value).toList.mkString.replaceAll("[ ,]", "").toDouble 
res8: Double = 2927927.545 
+0

Хорошо, но это нормально, но если моя строка составляет 2,927,9 евро, это возвращение 29279 вместо 2927,9, что нужно добавить для поддержки double & int? –

+0

А я вижу. См. Мое редактирование. –

1

Это не может быть однозначного ответа на ваш вопрос (I 'm не Scala coder), но я думаю, что это будет полезно в любом случае в сочетании с другими ответами и комментариями.

Вы заставили меня думать о создании регулярного выражения, чтобы идентифицировать только только денежные суммы, игнорируя другие цифры. Это то, что я придумал:

([$£€¥₹])?(\d{1,3}(?:[, ]?\d{1,3})?(?:.\d+)?)(?(1)|(kr\.?|Kč)) 

Этот пример обрабатывает сумм, заранее фиксируемых с признаками за доллары $, GB Фунты £, Евро , японская йена (? Или Китаев юань()) ¥ или индийских рупиях .

Он также обрабатывает валюты с символом «фиксированной» валюты с фиксированной валютой. В примере шведский/датский/норвежский кронор kr и чешский koruna .

Сумма всегда фиксируется в группе захвата 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.

+0

Смотрел ваш профиль, и поэтому «самый недооцененный» ответ. Сложность этого регулярного выражения отбрасывает меня;) Но чтобы добавить к нему немного больше, если хотите, французским людям нравится делать что-то не похожее на всех, и поэтому валюта написана с фиксированной стоимостью, а тысячи могут быть разделены пробелами ;): т.е. € 2,927.100' будет написано во Франции: '2 927,10 €' или '2 927,10 €' или '2927,10 €' или '2927,10 €': D – Esteban

+0

@Esteban Спасибо! Исправлено и добавлено в качестве примеров. :) – ClasG

+0

Извините, что сказал это, но ТЕПЕРЬ У меня нет выбора, чтобы продвигать его, и поэтому, сделав этот ответ, вы больше не будете «самым недооцененным»: p – Esteban

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