使用Regex从提供者字符串中获取金额

时间:2016-06-01 11:30:19

标签: regex scala

所以我有这个字符串:

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

如何解析任何货币的2927金额,并将其转换为double/int

这就是我的尝试:

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

编辑:

可以是任何货币符号。

2 个答案:

答案 0 :(得分:2)

这可能不是你问题的明确答案(我不是斯卡拉编码员)但我认为无论如何它都会有用,并结合其他答案和评论。

您让我考虑创建一个正则表达式来识别货币金额,忽略其他数字。这就是我想出的:

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

此示例使用美元$,GB磅£,欧元,日元(或中国人民币(?)){{1}的符号处理预先固定的金额或印度卢比¥

它还处理具有固定后货币“符号”的货币。例如瑞典语/丹麦语/挪威语克朗和捷克克朗kr

金额总是在捕获组2中捕获。前缀货币符号在组1中,后缀在组3中。(我想 - 如果您不知道货币,金额有多大。)

See it here at regex101,处理此文字:

  

搭载3.5升发动机的这款车的成本为2,927.100欧元,即3 271.32美元。在瑞典,大约27000kr。虽然我在捷克共和国的工作每小时支付436.5Kč,但我必须加班215天以节省资金,我可以节省10%的费用。我在日本的朋友买了一个357014.83元。

首先匹配可选的货币符号。然后它匹配金额,其格式可以像#####,###中的任何一个。之后它使用正则表达式条件 - 如果匹配的初始货币符号,它匹配任何内容 - >完成。如果不匹配,则会测试固定后的货币类型。

代码(从这里开始拍摄 - 没有Scala经历过这样的事情,只是一个“googler”):

##,###,###.###

修改

哇!这是一个难以破解的问题。我现在已经知道java正则表达式不支持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 构造。所以这是一个替代的,更复杂的替代方案:

if-else

它使用积极的预测来确定它是预先固定的还是固定后的货币符号。实际的捕获量必须分为两组,具体取决于 pre post 。因此,任何一种货币都在第1组,金额在2,或金额为3,货币为4。

And see functioning ;) code here at ideone

编辑#2

评论后添加了一些新货币和新内容。

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

Here at regex101

答案 1 :(得分: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

编辑:应该容纳双打......

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