首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >使用Regex从给定者字符串中获取金额

使用Regex从给定者字符串中获取金额
EN

Stack Overflow用户
提问于 2016-06-01 11:30:18
回答 2查看 578关注 0票数 0

所以我有一条绳子:

代码语言:javascript
运行
复制
val value = "\nValue is €2,927"

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

这就是我所尝试的:

代码语言:javascript
运行
复制
println(value.replaceAll("d{5}", ""))

编辑:

可能是任何货币符号。

EN

回答 2

Stack Overflow用户

发布于 2016-06-01 14:12:28

这可能不是你的问题的明确答案(我不是Scala编码器),但我认为它与其他答案和评论相结合,无论如何都是有用的。

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

代码语言:javascript
运行
复制
([$£€¥₹])?(\d{1,3}(?:[, ]?\d{1,3})?(?:.\d+)?)(?(1)|(kr\.?|Kč))

这个例子处理以美元$、GB英镑£、欧元、日元(或中国元人民币(?) ¥或印度卢比 )为标牌的金额。

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

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

在regex101这里见,处理此文本:

这辆装有3.5升发动机的汽车的价格是2,927.100欧元,或3,271.32美元。在瑞典,这将是大约27000公里。我得加班215天才能省下这么多钱,尽管我在捷克共和国的工作每小时支付436.5Kč,而且我可以节省10%的工资。我在日本的朋友花了357014.83元买了一个。

它首先匹配一个可选的货币符号。然后,它匹配的金额,可以格式化为任何一个#####,#####,###,###.###。在此之后,它使用regex条件--如果初始货币符号匹配,则不匹配->所做的任何操作。如果没有匹配,它会测试固定的货币类型。

代码(从这里拍摄-没有Scala经历过什么,只是一个“谷歌人”):

代码语言:javascript
运行
复制
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结构。因此,这里有一个更复杂的替代方案:

代码语言:javascript
运行
复制
(?=[$£€¥₹])(.)(\d{1,3}(?:,\d{3})?(?:\.\\d+)?)|(\d{1,3}(?:,\d{3})?(?:\.\d+)?)(kr\.?|Kč)

它使用积极的前瞻性来确定它是一个预先确定的,还是一个固定后的货币符号。实际的数量捕获必须分成两组取决于前或后。因此,任何一种货币都属于第1组,数量为2,或数量为3,货币为4。

)这里的代码在ideone

编辑#2

在评论后增加了一些新的货币和东西。

代码语言:javascript
运行
复制
(Rs.|[$£€¥₹])?\s*(\d{1,3}(?:[, ]?\d{1,3})?(?:.\d+)?)(?(1)|\s*(kr\.?|Kč|INR|€))

在regex101这里

票数 2
EN

Stack Overflow用户

发布于 2016-06-01 12:47:05

您可以从我的答案这里中得到类似的解决方案。所以:

代码语言:javascript
运行
复制
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

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

代码语言:javascript
运行
复制
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

对于空间..。

代码语言:javascript
运行
复制
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
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/37567406

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档