10

おそらく私は明らかな何かを見落としているだけですが、Playコントローラーでフォームフィールドをdoubleにバインドする方法がわかりません。

たとえば、これが私のモデルであると仮定します。

case class SavingsGoal(
timeframeInMonths: Option[Int],
amount: Double,
name: String
)

(私がお金のためにダブルを使用していることを無視してください、それは悪い考えだと知っています、これは単なる単純化された例です)

そして、私はそれをそのようにバインドしたかった:

object SavingsGoals extends Controller {

    val savingsForm: Form[SavingsGoal] = Form(

        mapping(
            "timeframeInMonths" -> optional(number.verifying(min(0))),
            "amount" -> of[Double],
            "name" -> nonEmptyText
        )(SavingsGoal.apply)(SavingsGoal.unapply)

    )

}

ヘルパーはintに対してのみ機能することに気付きましたが、使用するとdoubleをバインドできる可能性numberがあると思いました。of[]ただし、これについてコンパイラエラーが発生します。

Cannot find Formatter type class for Double. Perhaps you will need to import
play.api.data.format.Formats._  

APIにはダブルフォーマッターが定義されていないため、これを行っても役に立ちません。

これはすべて、Playでフォームフィールドをdoubleにバインドする標準的な方法は何であるかを尋ねる長い道のりです。

ありがとう!

編集:4e6は私を正しい方向に向けました。彼の助けを借りて私がしたことは次のとおりです。

彼のリンクのスニペットを使用して、app.controllers.Global.scalaに以下を追加しました。

object Global {

    /**
     * Default formatter for the `Double` type.
     */
    implicit def doubleFormat: Formatter[Double] = new Formatter[Double] {

      override val format = Some("format.real", Nil)

      def bind(key: String, data: Map[String, String]) =
        parsing(_.toDouble, "error.real", Nil)(key, data)

      def unbind(key: String, value: Double) = Map(key -> value.toString)
    }

    /**
     * Helper for formatters binders
     * @param parse Function parsing a String value into a T value, throwing an exception in case of failure
     * @param error Error to set in case of parsing failure
     * @param key Key name of the field to parse
     * @param data Field data
     */
    private def parsing[T](parse: String => T, errMsg: String, errArgs: Seq[Any])(key: String, data: Map[String, String]): Either[Seq[FormError], T] = {
      stringFormat.bind(key, data).right.flatMap { s =>
        util.control.Exception.allCatch[T]
          .either(parse(s))
          .left.map(e => Seq(FormError(key, errMsg, errArgs)))
      }
    }

}

次に、私のフォームマッピングで:

mapping(
    "amount" -> of(Global.doubleFormat)
)
4

2 に答える 2

11

バージョン2.1がアップしている場合は、グローバルのフォーマットを使用する必要はありません。

インポートするだけです:

import play.api.data.format.Formats._

および次のように使用します。

mapping(
    "amount" -> of(doubleFormat)
)
于 2015-03-25T09:53:00.073 に答える
10

実際には、マスターブランチには事前定義されたフォーマッタがあります。したがって、再生バージョンDoubleに切り替えるか、実装をコピーする必要があります。2.1-SNAPSHOT

于 2012-10-06T13:39:53.203 に答える