簡體   English   中英

DecimalFormat:沒有前導零,沒有指數,變量精度

[英]DecimalFormat: No leading zero, no exponential, variable precision

我正在使用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之后確定類型嗎?

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

確實,你非常接近答案。 正如您所看到的,嘗試中小數的行為是您在整數部分上所期望的行為。

正如你可以在Javadoc中看到的那樣#顯示為零缺席

編輯

如評論中所述,上述解決方案的問題是您只得到一個小數。 您可以通過API而不是模式更好地定義布局。

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

請注意,您還可以改進第一個解決方案

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

...但是定義大量小數位(如果你真的需要它)則不那么容易。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM