我在Scala
中有一个使用Postresql
的项目。它涉及Postresql的类型钱。我做了一项研究,发现我应该避免在Postgresql中使用money
数据类型并更好地使用NUMERIC
。
此外,我在客户端(在Scala中)使用BigDecimal
。但由于错误,我无法使其发挥作用:
could not find implicit value for parameter extractor: anorm.Column[BigDecimal]
[error] SqlParser.get[BigDecimal]("due_price") ~
所以问题是:
Play
和Postgresql
中使用哪些数据类型? BigDecimal
,我该如何摆脱错误? P.S。我知道java.util.Currency
,但我不需要它,我只需要金额的钱,应该是BigDecimal
。
答案 0 :(得分:4)
使用整数类型以美分存储货币以避免舍入错误和便士剃须是很常见的。您可以使用Int,Long,BigInt - 无论您喜欢什么。
答案 1 :(得分:1)
您可以使用BigDecimal,但问题是您从Anorm获得的BigDecimal类型是java.math.BigDecimal,而在您的案例类中,您实际上使用的是scala.math.BigDecimal。
要使其有效,您可以:
1)使用java.math.BigDecimal定义案例类,并在应用程序中使用此类型。
OR
2)在解析器中转换这两者并在应用程序中保留scala类型。这似乎是一个更好的解决方案。我们在生产中使用了这种方法。例如:
case class ABC (id: Int, price: BigDecimal, decimalPlaces: Int)
您的解析器将如下所示:
val simple = {
get[Int]("id") ~ get[java.math.BigDecimal]("price") ~ get[Int]("decimalPlaces") map {
case id ~ price ~ decimalPlaces => ABC(id, BigDecimal(price), decimalPlaces)
}
当您需要将Scala BigDecimal转换回Java BigDecimal(用于插入,更新等)时:
val priceAsJavaBD = priceAsScalaBD.bigDecimal //Returns java.math.BigDecimal
此外,您可以使用字段(例如decimalPlaces)来明确定义显示此价格时所需的小数位数。
答案 2 :(得分:0)
您的Anorm版本不提供Column [BigInt]提取器。您可以将其升级为master,也可以将master(Column.scala)中的实际Column定义复制到项目中,以便在编译时可用。