如何使用Scala框架播放处理十进制数

时间:2012-10-11 23:14:47

标签: scala playframework decimal

我希望能够在播放表单中输入十进制数字。我想有以下映射,但它不能编译。

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

一定有办法。我是Scala和Play的新手。任何指针,非常感谢。

3 个答案:

答案 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)