我希望能够在播放表单中输入十进制数字。我想有以下映射,但它不能编译。
mapping(
"id" -> ignored(NotAssigned:Pk[Long]),
"date" -> date("yyyy-MM-dd"),
"amount" -> decimal,
"description" -> nonEmptyText
)(Expense.apply)(Expense.unapply)
一定有办法。我是Scala和Play的新手。任何指针,非常感谢。
答案 0 :(得分:4)
对象Forms
上有方法of[T]
,它创建了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
函数。
答案 1 :(得分:3)
从this pull request开始,您现在可以指定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)
答案 2 :(得分:2)
这是您需要隐含的实际代码。我把它们放在一个单独的对象中,因为我也有很多这些用于我自己的类型。能够以Form
方式使用自定义类型非常方便。
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._
,您想要使用mapping
of[Double]
而Bob是您的叔叔,如下所示
def impactMapping = mapping(
"value" -> of[Double],
"percent" -> of[Double])(Impact.apply)(Impact.unapply)