Play2.0+Scala Formフォーマッタを追加する

お久しぶりです。こんにちは。

前回に引き続き、Play2+Scalaネタを1つ。

Play2でマスタメンテ等の登録フォームを作る際、play.api.data.Formクラスを使います。
この中で、フォームに入力された値とのマッピングを行う設定を行いますが、BigDecimalが用意されていません。
doubleを使えばいいのですが、ケースクラス側との兼ね合いでどうしてもBigDecimalを使いたい場合は自前でフォーマッターを作成しないといけません

import play.api.data._
import play.api.data.format.Formats._
import play.api.data.format.Formatter
import scala.util.control.Exception._
import scala.math.BigDecimal

object HogeController extends Controller {
  implicit def bigDecimalFormat: Formatter[BigDecimal] = new Formatter[BigDecimal] {
    override val format = Some("format.bigdecimal", Nil)

    def bind(key: String, data: Map[String, String]) = {
      catching(classOf[NumberFormatException]) opt BigDecimal(data.get(key).getOrElse("")) match {
        case Some(n) => {
          Right(n)
        }
        case None => Left(Seq(FormError(key, "error.bigdecimal", Nil)))
      }
    }
    def unbind(key: String, value: BigDecimal) = Map(key -> value.toString)
  }

  // 使い方
  implicit var form = Form(
    mapping(
      "bigDecimalValue" -> of[BigDecimal],
      "optBigDecimalValue" -> optional(of[BigDecimal]),
      ~
    )
  )
}

以上です。
こちらも、外部Objectファイルを用意すれば、importするだけで使えるようになります。