所以我有这个字符串:
val value = "\nValue is €2,927"
如何解析任何货币的2927
金额,并将其转换为double/int
?
这就是我的尝试:
println(value.replaceAll("d{5}", ""))
编辑:
€
可以是任何货币符号。
答案 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元。
首先匹配可选的货币符号。然后它匹配金额,其格式可以像Kč
,###
,##,###
中的任何一个。之后它使用正则表达式条件 - 如果匹配的初始货币符号,它匹配任何内容 - >完成。如果不匹配,则会测试固定后的货币类型。
代码(从这里开始拍摄 - 没有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č)
答案 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