我希望能够将十进制数字输入到游戏表格中。我想要以下映射,但它无法编译。
mapping(
"id" -> ignored(NotAssigned:Pk[Long]),
"date" -> date("yyyy-MM-dd"),
"amount" -> decimal,
"description" -> nonEmptyText
)(Expense.apply)(Expense.unapply)
一定有办法的。我对 Scala 和 Play 很陌生。任何指针,非常感谢。
我希望能够将十进制数字输入到游戏表格中。我想要以下映射,但它无法编译。
mapping(
"id" -> ignored(NotAssigned:Pk[Long]),
"date" -> date("yyyy-MM-dd"),
"amount" -> decimal,
"description" -> nonEmptyText
)(Expense.apply)(Expense.unapply)
一定有办法的。我对 Scala 和 Play 很陌生。任何指针,非常感谢。
of[T]
object 上有一个方法Forms
,它创建类型的映射T
。在您的情况下,它将是of[Int]
:
mapping(
"id" -> ignored(NotAssigned:Pk[Long]),
"date" -> date("yyyy-MM-dd"),
"amount" -> of[Int],
"description" -> nonEmptyText
)(Expense.apply)(Expense.unapply)
还有两个辅助方法
val number: Mapping[Int] = of[Int]
val longNumber: Mapping[Long] = of[Long]
这只是参考通用of
函数。
从这个拉取请求开始,您现在可以将BigDecimal指定为一种输入。修改 OP 的示例:
mapping(
"id" -> ignored(NotAssigned:Pk[Long]),
"date" -> date("yyyy-MM-dd"),
"amount" -> bigDecimal,
"description" -> nonEmptyText
)(Expense.apply)(Expense.unapply)
请注意bigDecimal映射类型。
要获得更高的精度和比例,您可以将它们指定为:
"amount" -> bigDecimal(10, 2)
这是您需要的隐式的实际代码。我把它们放在一个单独的对象中,因为我自己的类型也有很多。能够以Form
这种方式在 s 中使用自定义类型非常方便。
object FormFieldImplicits {
// Code merged into future Play release
//
implicit def doubleFormat = new Formatter[Double] {
def bind(key: String, data: Map[String, String]) = Right(data(key).toDouble)
def unbind(key: String, value: Double) = Map(key -> value.toString)
}
...
}
然后就import FormFieldImplicits._
在你想要使用 amapping
of[Double]
和 Bob 的你的叔叔的控制器中,如下所示
def impactMapping = mapping(
"value" -> of[Double],
"percent" -> of[Double])(Impact.apply)(Impact.unapply)