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