DecimalFormat:无前导零,无指数,可变精度

Chi*_*inz 4 java

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

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

为了摆脱指数,我检查了当前列的类型是否为 NUMERIC,然后用于ResultSet#getBigDecimal获取 BigDecimal。我这样做是因为 DB 中存储了各种 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");
}
Run Code Online (Sandbox Code Playgroud)

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

  • .007346 <-- 需要之前
  • 0.007346
  • -.4352 <-- 需要之前
  • -0.4352

为了解决这个问题,我在互联网上搜索并找到了这DecimalFormat门课。然后我能够格式化数字,以便我没有以下格式的前导零:

new DecimalFormat("#.");
Run Code Online (Sandbox Code Playgroud)

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

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

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

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

C.C*_*gne 5

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

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

正如您在Javadoc #中所读到的,零表示不存在

编辑

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

DecimalFormat format = new DecimalFormat();
format.setMinimumIntegerDigits(0);
format.setMaximumFractionDigits(2000);//should be more than enough
Run Code Online (Sandbox Code Playgroud)

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

DecimalFormat format = new DecimalFormat(".##################################################################");
Run Code Online (Sandbox Code Playgroud)

...但是定义大量的小数位数不太容易(如果你真的需要的话)。