如何优雅解决小数显示问题?

2020-01-17 16:29:10 +08:00
 vanillaxxx

服务端返回如下数据并生成一个 product 对象,字段类型是 BigDecimal

{
  "price1": 100,
  "price2": 99.99,
  "price3": 99.5
}

要在客户端显示出来的时候碰到下面的问题

1.如果在 strings.xml 做如下定义

<string name="data_price">¥%1$.2f</string>

界面上三个字段会显示成 ¥100.00 ,¥99.99 ,¥99.50

2.如果在 strings.xml 做如下定义

<string name="data_price">¥%1$s</string>

界面在 debug 下打包是预期的结果,然而在 release 下打包会变成 2 的情况

3.使用格式化工具

val format = DecimalFormat("0.##")

这样符合预期结果,但是代码中有几百处需要修改

想问问各位大佬,有没有更优雅的解决方案?造成 2 的原因是什么?

6759 次点击
所在节点    Android
9 条回复
NathanDo
2020-01-17 16:30:59 +08:00
在 Bean 的 Getter 中 format
chendy
2020-01-17 16:35:19 +08:00
让接口直接返回字符串…
vanillaxxx
2020-01-17 16:45:15 +08:00
@NathanDo
@chendy
这样就得更改字段类型成字符串啦,然而如果改成字符串,代码里面涉及到计算的部分又是另一个蛋疼的十二了[/捂脸]
chendy
2020-01-17 16:47:41 +08:00
@parorisim 不清楚你用的 json 库是什么,但是一般的 json 库都应该支持用字符串 序列化 /反序列化 BigDecimal 吧
x537196
2020-01-17 16:49:10 +08:00
涉及到价格的都是用的多少分=。=
{
"price1": 10000,
"price2": 9999,
"price3": 9950
}
vanillaxxx
2020-01-17 16:52:29 +08:00
@chendy #4 可能我没描述清楚,服务端返回没什么问题,我这边反序列化成 BigDecimal 也没有问题,奇怪的就是 debug 下它显示是预期中的结果,release 就不合适了,所以我在考虑要不要去魔改 BigDecimal 的 toString 方法
vanillaxxx
2020-01-17 16:53:45 +08:00
@x537196 #5 我们当时没有用分是考虑到客户端拿过来还得除个 100 嫌麻烦,数据库里面倒是分
execute
2020-01-17 17:29:25 +08:00
java.math.BigDecimal.stripTrailingZeros()
Pythondr
2020-01-18 10:35:37 +08:00
后段处理好返回指定位数的字符串

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/638789

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX