Java的MessageFormat支持数字和日期的灵活格式化:数字可用{0,number,样式}实现补零、千分位、百分比等;日期用{0,date,样式}支持预设或自定义模式;还可嵌套ChoiceFormat处理单复数等条件文本。

可以,Java 的 MessageFormat 支持对数字和日期进行灵活的自定义格式化,无需写死逻辑或手动拼接字符串。关键在于正确使用占位符中的 FormatType(如 number、date、time)和 FormatStyle(包括预设样式和自定义子模式)。
数字格式:补零、千分位、小数精度
用 {index,number,样式} 控制数字显示效果:
-
{0,number,00000}→ 将45转为00045(不足位补前导零) -
{0,number,#,##0.00}→1234.5显示为1,234.50(千分位 + 两位小数) -
{0,number,percent}→0.75变成75% -
{0,number,currency}→ 根据默认区域设置输出带货币符号的格式,如$123.45
日期与时间:用子模式精确控制输出
用 {index,date,样式} 或 {index,time,样式},其中样式可为预设(short/medium)或自定义模式:
-
{0,date,yyyy-MM-dd}→2026-05-10 -
{0,time,HH:mm:ss}→02:14:00(24小时制) -
{0,date,yyyy年MM月dd日 HH:mm}→2026年05月10日 02:14(中文格式,支持任意字符) -
{0,date,full}→ 输出完整本地化日期,如Saturday, May 10, 2026(取决于 Locale)
组合使用与复用实例
同一个 MessageFormat 实例可多次调用 format(),适合模板化场景:
- 声明:
MessageFormat fmt = new MessageFormat("订单{0,number,00000}创建于{1,date,yyyy-MM-dd HH:mm}"); - 调用:
fmt.format(new Object[]{123, new Date()})→订单00123创建于2026-05-10 02:14 - 注意:模式中若含花括号需双写,如
{{id}}输出字面量{id}
进阶:嵌套 ChoiceFormat 处理单复数
当需要根据数值动态切换文本(如“1 文件” vs “3 文件”),可配合 ChoiceFormat:
- 定义规则:
double[] limits = {0, 1, 2}; String[] formats = {"no files", "one file", "{0} files"}; - 绑定到占位符:
form.setFormatByArgumentIndex(0, new ChoiceFormat(limits, formats)); - 结果:
form.format(new Object[]{1, "MyDisk"})→The disk "MyDisk" contains one file.










