2

我希望能够将十进制数字输入到游戏表格中。我想要以下映射,但它无法编译。

mapping(
 "id" -> ignored(NotAssigned:Pk[Long]),
 "date" -> date("yyyy-MM-dd"),
 "amount" -> decimal,
 "description" -> nonEmptyText
)(Expense.apply)(Expense.unapply)

一定有办法的。我对 Scala 和 Play 很陌生。任何指针,非常感谢。

4

3 回答 3

4

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函数。

于 2012-10-12T06:30:18.563 回答
3

这个拉取请求开始,您现在可以将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)
于 2013-08-05T16:30:59.610 回答
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)
于 2012-10-13T09:29:23.457 回答