首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 更多程式語言 >> 程式設計綜合問答

Android TextView 顯示 Double 數值去除多餘小數點零的方法

     編輯:程式設計綜合問答

問題現象

在 Android 開發中,將 double 類型的計算結果直接轉字串顯示在 TextView 時,常遇到「5.0」這類多餘小數點的問題。例如:

double result = 5.0;
textView.setText(String.valueOf(result)); // 顯示 "5.0",期望 "5"

若直接用 new Double(result).toString() 或 String.valueOf(),Java 預設會保留 .0,影響 UI 美觀。

核心原因

Java 的 Double.toString() 遵循 IEEE 754 標準,對於整數值的浮點數會輸出 x.0 格式。這是語言層面的預設行為,非 Bug。

解決方案對比

方案一:DecimalFormat(推薦,靈活可控)

使用 java.text.DecimalFormat 定義格式模式,可精確控制小數位數、分組符號等。

double value = 5.0;
DecimalFormat df = new DecimalFormat("#.##"); // 最多保留兩位小數,整數不顯示小數點
String formatted = df.format(value); // "5"

double value2 = 3.14159;
String formatted2 = df.format(value2); // "3.14"
  • # 表示選擇性數字(前導/尾隨零不顯示)
  • 0 表示強制佔位(不足補零)
  • 模式 "#.##########" 可保留最多 10 位小數

方案二:String 格式化(簡潔)

String formatted = String.format(Locale.getDefault(), "%.2f", value).replaceAll("\\.0+$", "").replaceAll("\\.(\\d*?)0+$", ".$1");
// 或更簡單:若只需去除尾部 .0
String simple = String.format("%.2f", value).replace(".00", "").replace(".0", "");

注意:String.format 預設使用系統 Locale,可能產生逗號分隔符,建議指定 Locale.US 或 Locale.getDefault()。

方案三:BigDecimal(精確計算場景)

若涉及金融、精確科學計算,應全程使用 BigDecimal,最後再格式化輸出:

BigDecimal bd = new BigDecimal("5.00").stripTrailingZeros();
String result = bd.toPlainString(); // "5"

方案四:Kotlin 擴展函數(現代專案首選)

// Kotlin 擴展
fun Double.formatSmart(): String = if (this == this.toLong()) toLong().toString() else this.toString()

// 使用
textView.text = 5.0.formatSmart() // "5"
textView.text = 3.14.formatSmart() // "3.14"

常見誤區澄清

誤區:「double result = (double) num1 / num2; 強制轉型就能解決顯示問題」

事實:強制轉型只影響運算精度,不影響 後續 toString() 的輸出格式。5.0 依然會顯示為 "5.0"。

最佳實踐建議

  1. UI 顯示層統一格式化:在 ViewModel 或 Presenter 中格式化,View 僅負責 setText。
  2. 定義通用工具類:封裝 NumberFormatUtil.formatDouble(double, int maxDecimals),全專案複用。
  3. 考慮本地化:使用 NumberFormat.getInstance(Locale) 自動適配用戶地區的數字格式(如歐洲用逗號作小數點)。
  4. 避免浮點數比較:判斷是否為整數時,用 Math.abs(value - Math.round(value)) < 1e-10 而非 value == (long)value。

結語

去除 Double 顯示多餘的 .0 純屬格式化問題,DecimalFormat 是功能最全、最標準的解法;Kotlin 專案可寫擴展函數簡化調用。切記:運算用 double/BigDecimal,顯示用 Formatter,分離關注點才是良好架構。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved