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するだけで使えるようになります。