所以我有一条绳子:
val value = "\nValue is €2,927"我如何解析这个金额2927,的任何货币,并将其转换为double/int?
这就是我所尝试的:
println(value.replaceAll("d{5}", ""))编辑:
€可能是任何货币符号。
发布于 2016-06-01 14:12:28
这可能不是你的问题的明确答案(我不是Scala编码器),但我认为它与其他答案和评论相结合,无论如何都是有用的。
您让我考虑创建一个正则表达式,只识别的货币金额(),而忽略其他数字。这就是我想出来的:
([$£€¥₹])?(\d{1,3}(?:[, ]?\d{1,3})?(?:.\d+)?)(?(1)|(kr\.?|Kč))这个例子处理以美元$、GB英镑£、欧元€、日元(或中国元人民币(?) ¥或印度卢比₹ )为标牌的金额。
它还处理带有后固定货币“符号”的货币。例如,瑞典/丹麦/挪威克朗kr和捷克克朗Kč。
金额总是在捕获组2中捕获。前缀货币符号在第1组中,后置在第3组中。(我想--如果您不知道该货币,那么金额有多大?)
在regex101这里见,处理此文本:
这辆装有3.5升发动机的汽车的价格是2,927.100欧元,或3,271.32美元。在瑞典,这将是大约27000公里。我得加班215天才能省下这么多钱,尽管我在捷克共和国的工作每小时支付436.5Kč,而且我可以节省10%的工资。我在日本的朋友花了357014.83元买了一个。
它首先匹配一个可选的货币符号。然后,它匹配的金额,可以格式化为任何一个###,##,###,##,###,###.###。在此之后,它使用regex条件--如果初始货币符号匹配,则不匹配->所做的任何操作。如果没有匹配,它会测试固定的货币类型。
代码(从这里拍摄-没有Scala经历过什么,只是一个“谷歌人”):
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编辑
哇!这是一个很难解决的问题。我现在已经了解到,java regex不支持if-else结构。因此,这里有一个更复杂的替代方案:
(?=[$£€¥₹])(.)(\d{1,3}(?:,\d{3})?(?:\.\\d+)?)|(\d{1,3}(?:,\d{3})?(?:\.\d+)?)(kr\.?|Kč)它使用积极的前瞻性来确定它是一个预先确定的,还是一个固定后的货币符号。实际的数量捕获必须分成两组取决于前或后。因此,任何一种货币都属于第1组,数量为2,或数量为3,货币为4。
)这里的代码在ideone。
编辑#2
在评论后增加了一些新的货币和东西。
(Rs.|[$£€¥₹])?\s*(\d{1,3}(?:[, ]?\d{1,3})?(?:.\d+)?)(?(1)|\s*(kr\.?|Kč|INR|€))https://stackoverflow.com/questions/37567406
复制相似问题