Java数字格式化(NumberFormat和DecimalFormat)详解
Java 语言中,提供了两个可以用于完成数字格式化的类,一个是 NumberFormat 类,一个是 DecimalFormat 类。
例如,可以将一个数值格式化为符合某个国家或地区习惯的数值字符串,也可以将符合某个国家或地区习惯的数值字符串解析为相应的数值。
同时,NumberFormat 类也是一个抽象类,是 Format 类的子类,不能直接通过 new 关键字来进行对象的创建。NumberFormat 类提供了很多静态方法用于获取其实例对象,具体如下表所示:
另外,NumberFormat 类提供的常用方法主要有两个,具体如下表所示:
接下来,通过案例来演示 NumberFormat 类常用方法的使用:
使用该类格式化数字时要比直接使用 NumberFormat 类更加方便,因为可以直接按照用户自定义的方式进行相应的格式化操作,同时也支持解析和格式化任何语言环境以及不同类型的数字,包括整数、小数、科学计数法表示的数、百分数和货币金额等。
需要注意的是,对于数值的小数部分,默认只是显示 3 位小数,当超出小数点后 3 位时,采用四舍五入的方法进行舍余。
DecimalFormat 类常用的实例化方法如下表所示:
DecimalFormat 类除了提供 format() 和 parse() 方法之外,还提供了 applyPattern(String pattern) 方法来自定义格式化规则。
接下来,通过案例来演示 DecimalFormat 类常用方法的使用:
除了以上基本使用方法外,DecimalFormat 类还支持使用不同的符号来代表不同的格式,常用符号以及代表意义如下表所示:
Java NumberFormat类格式化
NumberFormat 类用于解析和格式化任何语言环境的数字,可以按照本地的语言风格进行数字的显示。例如,可以将一个数值格式化为符合某个国家或地区习惯的数值字符串,也可以将符合某个国家或地区习惯的数值字符串解析为相应的数值。
同时,NumberFormat 类也是一个抽象类,是 Format 类的子类,不能直接通过 new 关键字来进行对象的创建。NumberFormat 类提供了很多静态方法用于获取其实例对象,具体如下表所示:
方法 | 方法描述 |
---|---|
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" |