我正在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 来确定类型吗?
怎么样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)
...但是定义大量的小数位数不太容易(如果你真的需要的话)。
| 归档时间: |
|
| 查看次数: |
1378 次 |
| 最近记录: |