88. Java 数字和字符串 - DecimalFormat  类基本用法

263 阅读3分钟

88. Java 数字和字符串 - DecimalFormat 类基本用法

一、引言

在实际开发中,我们常常需要将数字格式化为特定的字符串形式。Java 中的 java.text.DecimalFormat 类提供了极大的灵活性,可以控制数字的显示方式,例如前导零、尾随零、前缀和后缀、分组符(千位分隔符)以及小数点分隔符。但同时它也可能使代码变得复杂,因此在使用时需要理解其模式(pattern)的规则和内涵。


二、DecimalFormat 基本用法

2.1 模式和符号说明

DecimalFormat通过传入一个模式字符串来定义格式。模式中常用的符号及其含义如下:

  • #:表示数字,如果该位数字不存在则不显示(不会补零)。
  • 0:表示数字,如果位数不足则以 0 填充,保证显示该位数字。
  • ,:分组分隔符,用于千位分隔(在整数部分)。
  • .:小数点分隔符。
  • $、¤:可以作为前缀或后缀,常用于表示货币;¤ 若双写则显示国际货币符号。

例如:

  • "###,###.###":显示整数部分每三位加逗号,小数部分最多显示 3 位。
  • "000000.000":强制显示至少 6 位整数和 3 位小数,不足部分用 0 补齐。
  • "$###,###.###":在格式化后的字符串最左边加上美元符号。

2.2 示例程序

下面的示例程序演示了如何使用 DecimalFormat 格式化数字:

import java.text.*;

public class DecimalFormatDemo {

   static public void customFormat(String pattern, double value) {
      DecimalFormat myFormatter = new DecimalFormat(pattern);
      String output = myFormatter.format(value);
      System.out.println(value + "  " + pattern + "  " + output);
   }

   public static void main(String[] args) {
      customFormat("###,###.###", 123456.789);
      customFormat("###.##", 123456.789);
      customFormat("000000.000", 123.78);
      customFormat("$###,###.###", 12345.67);
   }
}
123456.789  ###,###.###  123,456.789
123456.789  ###.##  123456.79
123.78  000000.000  000123.780
12345.67  $###,###.###  $12,345.67

输出说明:

模式输出解释
123456.789###,###.###123,456.789# 表示数字,逗号为分组占位符,句点为小数点占位符。
123456.789###.##123456.79小数点右侧原有 3 位,但模式只有 2 位,因此结果经过四舍五入。
123.78000000.000000123.780模式用 0 补齐前导和尾随零。
12345.67$###,###.###$12,345.67模式前置美元符号,且分组符号控制整数部分显示。

三、DecimalFormat 的进阶特性

3.1 控制符号和自定义格式

除了基本的数字格式化,DecimalFormat 还支持通过 DecimalFormatSymbols 类来自定义各种格式符号,如小数分隔符和分组符号。示例:

import java.text.*;
import java.util.Locale;

public class CustomSymbolsDemo {
    public static void main(String[] args) {
        DecimalFormatSymbols unusualSymbols = new DecimalFormatSymbols(Locale.getDefault());
        unusualSymbols.setDecimalSeparator('|');  // 将小数点替换为竖线
        unusualSymbols.setGroupingSeparator('^');   // 将分组符号替换为^
        
        String pattern = "#,##0.###";
        DecimalFormat weirdFormatter = new DecimalFormat(pattern, unusualSymbols);
        weirdFormatter.setGroupingSize(4); // 分组大小设置为4位
        String output = weirdFormatter.format(12345.678);
        System.out.println(output);  // 输出:1^2345|678
    }
}

3.2 舍入模式

默认情况下,DecimalFormat 使用 RoundingMode.HALF_EVEN(银行家算法)。这种舍入方式会根据前一位是奇数还是偶数来决定四舍五入:

  • 若前一位为偶数,遇到精度截断时则舍去(如 3.25 保留一位小数结果为 3.2)。
  • 若前一位为奇数,则进一(如 3.35 保留一位小数结果为 3.4)。

如果希望实现标准的四舍五入(即 RoundingMode.HALF_UP),可以通过以下方式设置:

// 创建 DecimalFormat 实例
DecimalFormat df = new DecimalFormat("#.#");

// 设置舍入模式为 RoundingMode.HALF_UP
df.setRoundingMode(RoundingMode.HALF_UP);

// 测试数据
double num1 = 3.25;
double num2 = 3.35;

// 格式化数据
String result1 = df.format(num1);
String result2 = df.format(num2);

// 输出结果
System.out.println("3.25 保留一位小数,结果为: " + result1);
System.out.println("3.35 保留一位小数,结果为: " + result2);
3.25 保留一位小数,结果为: 3.3
3.35 保留一位小数,结果为: 3.4

改为银行家算法df.setRoundingMode(RoundingMode.HALF_EVEN);将输出:

3.25 保留一位小数,结果为: 3.2
3.35 保留一位小数,结果为: 3.4

四、总结

  • DecimalFormat 的核心在于模式字符串,模式中的 #0 决定了数字显示的精度和补零方式。
  • 自定义符号:通过 DecimalFormatSymbols 可自定义小数分隔符、分组符号等。
  • 舍入策略:默认使用银行家算法,如果需要四舍五入,可通过 setRoundingMode 方法设置。
  • 实际应用:根据不同需求,可用于格式化货币、百分比等各种数字显示。