2016-11-19 6 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

スカラバージョン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

私はそれが何か簡単であることを期待しました。 Scalaの一般的なエラーメッセージは参考になります。 – andreas

関連する問題