如何从以微单位表示的给定金额中提取单位和子单位部分?
How to extract the unit and subunit parts from the given amount of money represented in microunits?
我正在 Java 进行项目,并且有一个微型单位的价格。
微单位价格是一个价格,1,000,000 微单位等于一单位货币。例如,如果价格为“€7.99”,则 price_amount_micros 为“7990000”
我需要将 7 和 99 提取为单独的字符串。阅读了一些关于舍入误差的帖子后,我认为实现我需要的正确方法是将给定数量转换为字符串并使用以下正则表达式提取单位和子单位部分:
^(\d+)(\d{2})0000$
但是,由于某些原因,我觉得这不是一种优雅的方式。
您可以将其细化为:
^(\d+)(\d{2})0{4}$
但是恕我直言,你已经完成了。
我在我的数据库中将所有价格作为 INT 处理。
7.99 就是 799。
没有舍入错误。
这可能看起来有点矫枉过正,但为了更安全地解决浮点问题,您可以使用基于 BigDecimal
的逻辑,如下所示:
void extractParts(String str) {
BigDecimal bd = new BigDecimal(str);
BigDecimal res = bd.scaleByPowerOfTen(-6);
BigDecimal rem = res.remainder(BigDecimal.ONE).stripTrailingZeros();
System.out.printf("<%s> <%s>%n", res.longValue(),
rem.movePointRight(rem.scale()).abs().longValue());
}
然后将其命名为:
extractParts("7990000");
//=> <7> <99>
extractParts("-1835000");
//=> <-1> <835>
extractParts("89000000");
//=> <89> <0>
我正在 Java 进行项目,并且有一个微型单位的价格。
微单位价格是一个价格,1,000,000 微单位等于一单位货币。例如,如果价格为“€7.99”,则 price_amount_micros 为“7990000”
我需要将 7 和 99 提取为单独的字符串。阅读了一些关于舍入误差的帖子后,我认为实现我需要的正确方法是将给定数量转换为字符串并使用以下正则表达式提取单位和子单位部分:
^(\d+)(\d{2})0000$
但是,由于某些原因,我觉得这不是一种优雅的方式。
您可以将其细化为:
^(\d+)(\d{2})0{4}$
但是恕我直言,你已经完成了。
我在我的数据库中将所有价格作为 INT 处理。 7.99 就是 799。 没有舍入错误。
这可能看起来有点矫枉过正,但为了更安全地解决浮点问题,您可以使用基于 BigDecimal
的逻辑,如下所示:
void extractParts(String str) {
BigDecimal bd = new BigDecimal(str);
BigDecimal res = bd.scaleByPowerOfTen(-6);
BigDecimal rem = res.remainder(BigDecimal.ONE).stripTrailingZeros();
System.out.printf("<%s> <%s>%n", res.longValue(),
rem.movePointRight(rem.scale()).abs().longValue());
}
然后将其命名为:
extractParts("7990000");
//=> <7> <99>
extractParts("-1835000");
//=> <-1> <835>
extractParts("89000000");
//=> <89> <0>