2016-11-19 85 views
1

我有一个小帮手方法,它必须规范一些货币值。因此,我写了一些正则表达式,它应该检测表示它们的不同方式。奇怪的是,它们只有在与Regex.findAllIn(..)一起使用时才会触发,但如果在匹配大小写语句中使用则不会触发。匹配大小写不像Regex.findAll

val result = extractAmount("23772.90") 

def extractAmount(amountStr: String): BigDecimal = { 
    val Plain = """^\d+$""".r 
    val Dot = """^(\d+)\.(\d*)$""".r 
    val Comma = """^(\d+),(\d*)$""".r 
    val DotComma = """^(\d+)\.(\d+),(\d*)$""".r 
    val CommaDot = """^(\d+),(\d+)\.(\d*)$""".r 

    if (Dot.findAllIn(amountStr).hasNext) 
    println(Dot.findAllIn(amountStr).next()) 

    amountStr match { 
    case Plain(value) => new java.math.BigDecimal(value) 
    case Dot(values) => new BigDecimal(s"${values(0)}.${values(1)}") 
    case Comma(values) => new BigDecimal(s"${values(0)}.${values(1)}") 
    case DotComma(values) => new BigDecimal(s"${values(0)}${values(1)}.${values(2)}") 
    case CommaDot(values) => new BigDecimal(s"${values(0)}${values(1)}.${values(2)}") 
    case _ => throw new RuntimeException(s"Money amount string -->${amountStr}<-- did not match any pattern.") 
    } 
} 

调试器输出打Regex.findAllIn(..): debugger screen shot 1

调试输出不打比赛的情况下为点(值): debugger screen shot 2

同样有趣的可能是以下错误消息在调试器中: Debugger error message

使用scala版本2.11.8。

我很困惑,肯定会忽略一些明显的东西。感谢提示。

+2

请使用代码片段而不是截图。它将帮助贡献者重现这个问题。 – maasg

+0

@maasg:刚刚添加了一个代码片段 – andreas

回答

3

而不是做例如

case Dot(values) => new BigDecimal(s"${values(0)}.${values(1)}") 

重写Regex提取的用法是这样的:

case Dot(a, b) => new BigDecimal(s"$a.$b") 

的参数在各提取金额必须组的您正则表达式中包含的量相匹配(在这里:2)。每个参数都是一个表示单个组的内容的字符串。

+0

我期待它是一件容易的事:)感谢tipp。一般来说,Scala中的错误信息很有用,这次不是那么多... – andreas