首页 > 编程笔记 > Java笔记 阅读:9

Java数字格式化(NumberFormat和DecimalFormat)详解

Java 语言中,提供了两个可以用于完成数字格式化的类,一个是 NumberFormat 类,一个是 DecimalFormat 类。

Java NumberFormat类格式化

NumberFormat 类用于解析和格式化任何语言环境的数字,可以按照本地的语言风格进行数字的显示。

例如,可以将一个数值格式化为符合某个国家或地区习惯的数值字符串,也可以将符合某个国家或地区习惯的数值字符串解析为相应的数值。

同时,NumberFormat 类也是一个抽象类,是 Format 类的子类,不能直接通过 new 关键字来进行对象的创建。NumberFormat 类提供了很多静态方法用于获取其实例对象,具体如下表所示:

表:NumberFormate类的对象获取方式
方法 方法描述
static NumberFormat getInstance() 返回默认语言环境的通用数值格式
static NumberFormat getLocale(Locale inLocale) 返回指定语言环境的通用数值格式
static NumberFormat getCurrencyInstance() 返回指定语言环境的货币格式
static NumberFormat getCurrencyInstance(Locale inLocale) 返回指定语言环境的货币格式
static NumberFormat getIntegerInstance() 返回当前默认环境的整数格式
static NumberFormat getIntegerInstance(Locale inLocale) 返回指定语言环境的整数格式
static NumberFormat getNumberInstance() 返回指定语言环境的通用数值
static NumberFormat getNumberInstance(Locale inLocale) 返回指定语言环境的通用数值
static NumberFormat getPercentInstance() 返回当前默认环境的百分比格式
static NumberFormat getPercentInstance(Locale inLocale) 返回指定语言环境的百分比格式
void setSeed(long seed) 设置 Random 对象中的种子数

另外,NumberFormat 类提供的常用方法主要有两个,具体如下表所示:

方法 方法描述
String format(数值) 将某个数值格式化为符合某个国家或地区习惯的数值字符串
Number parse(String source) 将符合某个国家或地区习惯的数值字符串解析为对应的数值

接下来,通过案例来演示 NumberFormat 类常用方法的使用:
import java.text.NumberFormat;
import java.text.ParseException;
import java.util.Locale;

public class Demo {
    public static void main(String[] args) throws ParseException {
        NumberFormat nf = NumberFormat.getInstance();
        // 将数值格式化为符合某个国家或地区习惯的数值字符串
        int price = 13;
        System.out.println("price:" + price);
        System.out.println("以默认语言格式化price:" + nf.format(price));
        nf = NumberFormat.getCurrencyInstance(Locale.US);
        System.out.println("以US格式化price:" + nf.format(price));
        nf = NumberFormat.getCurrencyInstance(Locale.FRANCE);
        System.out.println("以FRANCE格式化price:" + nf.format(price));
        // 将符合某个国家或地区习惯的数值字符串解析为对应的数值
        nf = NumberFormat.getCurrencyInstance(Locale.US);
        String str = "$13.00";
        Number n = nf.parse(str);
        System.out.println("将$13.00格式化为数值: " + n.doubleValue());
        // 其他格式化
        double d = 0.35;
        nf = NumberFormat.getPercentInstance();
        System.out.println("0.35的百分比: " + nf.format(d));
    }
}

程序的运行结果如下:
price:13
以默认语言格式化price:13
以US格式化price:$13.00
以FRANCE格式化price:13,00 €
将$13.00格式化为数值: 13.0
0.35的百分比: 35%

Java DecimalFormat类格式化

DecimalFormat 类是 NumberFormat 类的一个具体子类,用于格式化十进制数字。

使用该类格式化数字时要比直接使用 NumberFormat 类更加方便,因为可以直接按照用户自定义的方式进行相应的格式化操作,同时也支持解析和格式化任何语言环境以及不同类型的数字,包括整数、小数、科学计数法表示的数、百分数和货币金额等。

需要注意的是,对于数值的小数部分,默认只是显示 3 位小数,当超出小数点后 3 位时,采用四舍五入的方法进行舍余。

DecimalFormat 类常用的实例化方法如下表所示:

方法 方法描述
new DecimalFormat() 构造方法,使用默认语言环境的默认模式和符号创建对象
new DecimalFormat(String pattern) 构造方法,指定规则进行对象创建

DecimalFormat 类除了提供 format() 和 parse() 方法之外,还提供了 applyPattern(String pattern) 方法来自定义格式化规则。

接下来,通过案例来演示 DecimalFormat 类常用方法的使用:
import java.text.DecimalFormat;
import java.text.ParseException;

public class Demo {
    public static void main(String[] args) throws ParseException {
        double PI = 3.1415926;
        DecimalFormat df0 = new DecimalFormat();
        DecimalFormat df1 = new DecimalFormat("0.0000");
        System.out.println("PI_0: " + df0.format(PI));
        System.out.println("PI_1: " + df1.format(PI));
        String numStr = "11.111";
        Number num = df1.parse(numStr);
        System.out.println("df1.parse(numStr):" + num.doubleValue());
    }
}
程序的运行结果如下:

PI_0: 3.1416
PI_1: 3.142
df1.parse(numStr):11.111


除了以上基本使用方法外,DecimalFormat 类还支持使用不同的符号来代表不同的格式,常用符号以及代表意义如下表所示:

符号 位置 是否本地化 含义
0 数字 阿拉伯数字
# 数字 阿拉伯数字,如果不存在则显示为空
. 数字 小数分隔符或货币小数分隔符
- 数字 减号
, 数字 分组分隔符
E 数字 分隔科学计数法中的尾数和指数。在前缀或后缀中无须加引号
; 子模式边界 分隔正数和负数子模式
% 前缀或后缀 乘以 100 并显示为百分数
/u2030 前缀或后缀 乘以 1000 并显示为千分数
¤(/u000A4) 前缀或后缀 货币记号,由货币符号替换。如果两个同时出现,则用国际货币符号替换。如果出现在某个模式中,则使用货币小数分隔符,而不使用小数分隔符
' 前缀或后缀 用于在前缀或后缀中为特殊字符加引号。例如,"#" 将 123 格式化为 "#123"。要创建单引号本身,请连续使用两个单引号,如 "# o'clock"

相关文章