DecimalFormat:没有前导零,没有指数,变量精度

时间:2016-09-12 13:21:13

标签: java

我正在使用Oracle DB和JDBC。我必须选择一些值并将它们写入文件。

首先我使用了ResultSet#getString,它给了我几乎所有按照需要格式化的值,除非有时数字用指数表示。例如:0.0897234E-4

为了摆脱指数,我检查了当前列的类型是否为NUMERIC,然后使用ResultSet#getBigDecimal来获取BigDecimal。我之所以这样做是因为数据库中存储了各种Java数字类型,而且Oracle DB只提供NUMERIC作为数字类型,我必须使用BigDecimal,因为每个数字Java类型都可以存储在BigDecimal中。
然后我使用BigDecimal#toPlainString方法有效地摆脱了指数。

if (rset.getMetaData().getColumnType(i) == java.sql.Types.NUMERIC) {
    value = (rset.getBigDecimal(i) != null rset.getBigDecimal(i).toPlainString() : "0");
}

接下来的问题是,当数字低于1时我得到一个前导零,但我不想要它们。

  • .007346之前< - 期望
  • 之前
  • 0.007346
  • 之后
  • -.4352之前< - 期望
  • 之前
  • -0.4352
  • 之后

为了解决这个问题,我搜索了互联网并找到了DecimalFormat类。然后我能够格式化数字,以便我不会使用以下格式的前导零:

new DecimalFormat("#.");

但是这当然没有显示小数点后的任何数字,但在每个数字后面都会添加一个小数点。例如:1235. -65.

所以我想要的是,如果数字是十进制的,那么应该有所需的数字(实际上是38,我认为在Oracle DB中最多)。永远不应该有指数,如果数字低于1则不应该是前导零。如果数字是自然的,那么最后不应该是小数点。

所需格式的一些示例:  9873478 -1349 .743803 -.004726

我如何实现这样的表现?欢迎任何解决方案我不必使用DecimalFormat。可能的解决方案是,我必须通过尝试将数字转换为不同的Java类型来获取数字作为BigDecimal后确定类型吗?

1 个答案:

答案 0 :(得分:4)

new DecimalFormat(".#");怎么样?

你的确非常接近答案。正如您所看到的,尝试中小数的行为是您在整数部分上所期望的行为。

正如您可以在Javadoc #中看到的那样,零缺席

修改

如评论中所述,上述解决方案的问题是您只得到一个小数。您最好通过API而不是模式来定义布局。

DecimalFormat format = new DecimalFormat();
format.setMinimumIntegerDigits(0);
format.setMaximumFractionDigits(2000);//should be more than enough

请注意,您还可以改进第一个解决方案

DecimalFormat format = new DecimalFormat(".##################################################################");

...但是定义大量的小数位(如果真的需要它)就不那么容易了。