我正在使用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后确定类型吗?
答案 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(".##################################################################");
...但是定义大量的小数位(如果真的需要它)就不那么容易了。