DateFormat、NumberFormat、MessageFormat

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档

文章目录

  • java.text.Format体系
  • 1.DateFormat:日期时间格式化
    • SimpleDateFormat
  • 2.NumberFormat:数字格式化
    • DecimalFormat
  • 3.MessageFormat:字符串格式化
    • 简单案例
    • 2.参数模式
    • 3.注意事项
    • 4.经典使用场景
    • 5.特殊使用
      • 数字
      • 日期
      • 时间
      • 在结论上补充其他更加特殊情况


java.text.Format体系

在日常开发中,我们经常会有格式化的需求,如日期格式化、数字格式化、钱币格式化等等。

在这里插入图片描述

格式化器的作用似乎跟转换器的作用类似,但是它们的关注点却不一样:

  • 转换器:将类型S转换为类型T,关注的是类型而非格式
  • 格式化器: String <-> Java类型。这么一看它似乎和PropertyEditor类似,但是它的关注点是字符串的格式

在这里插入图片描述
Java里从来都缺少不了字符串拼接的活,JDK也提供了多种“工具”供我们使用,如:StringBuffer、StringBuilder以及最直接的+号,相信这些大家都有用过。但这都不是本文的内容,本文将讲解格式化器,给你提供一个新的思路来拼接字符串,并且是推荐方案。

JDK内置有格式化器,便是java.text.Format体系。它是个抽象类,提供了两个抽象方法:

public abstract class Format implements Serializable, Cloneable {public abstract StringBuffer format(Object obj, StringBuffer toAppendTo, FieldPosition pos);	public abstract Object parseObject (String source, ParsePosition pos);
}
  • format:将Object格式化为String,并将此String放到toAppendTo里面
  • parseObject:讲String转换为Object,是format方法的逆向操作

在这里插入图片描述

1.DateFormat:日期时间格式化

抽象类。用于用于格式化日期/时间类型java.util.Date。虽然是抽象类,但它提供了几个静态方法用于获取它的实例:

// 格式化日期 + 时间
public final static DateFormat getInstance() {return getDateTimeInstance(SHORT, SHORT);
}
public final static DateFormat getDateTimeInstance(int dateStyle, int timeStyle, Locale aLocale){return get(timeStyle, dateStyle, 3, aLocale);
}// 格式化日期
public final static DateFormat getDateInstance(int style, Locale aLocale) {return get(0, style, 2, aLocale);
}
// 格式化时间
public final static DateFormat getTimeInstance(int style, Locale aLocale){return get(style, 0, 1, aLocale);
}

在这里插入图片描述
有了这些静态方法,你可在不必关心具体实现的情况下直接使用:

    @Testpublic void test1() {Date curr = new Date();// 格式化日期 + 时间System.out.println(DateFormat.getInstance().getClass() + "-->" + DateFormat.getInstance().format(curr));System.out.println(DateFormat.getDateTimeInstance().getClass() + "-->" + DateFormat.getDateTimeInstance().format(curr));// 格式化日期System.out.println(DateFormat.getDateInstance().getClass() + "-->" + DateFormat.getDateInstance().format(curr));// 格式化时间System.out.println(DateFormat.getTimeInstance().getClass() + "-->" + DateFormat.getTimeInstance().format(curr));}

在这里插入图片描述

SimpleDateFormat

一般来说,我们会直接使用SimpleDateFormat来对Date进行格式化,它可以自己指定Pattern,个性化十足。如:
在这里插入图片描述

2.NumberFormat:数字格式化

抽象类。用于格式化数字,它可以对数字进行任意格式化,如小数、百分数、十进制数等等。它有两个实现类:

在这里插入图片描述

    @Testpublic void test41() {double myNum = 1220.0455;System.out.println(NumberFormat.getInstance().getClass() + "-->" + NumberFormat.getInstance().format(myNum));System.out.println(NumberFormat.getCurrencyInstance().getClass() + "-->" + NumberFormat.getCurrencyInstance().format(myNum));System.out.println(NumberFormat.getIntegerInstance().getClass() + "-->" + NumberFormat.getIntegerInstance().format(myNum));System.out.println(NumberFormat.getNumberInstance().getClass() + "-->" + NumberFormat.getNumberInstance().format(myNum));System.out.println(NumberFormat.getPercentInstance().getClass() + "-->" + NumberFormat.getPercentInstance().format(myNum));}

在这里插入图片描述

DecimalFormat

Decimal:小数,小数的,十进位的。

用于格式化十进制数字。它具有各种特性,可以解析和格式化数字,包括:西方数字、阿拉伯数字和印度数字。它还支持不同种类的数字,包括:整数(123)、小数(123.4)、科学记数法(1.23E4)、百分数(12%)和货币金额($123)。所有这些都可以进行本地化。
在这里插入图片描述
在这里插入图片描述
说明:Number和Digit的区别:

  • Number是个抽象概念,其表达形式可以是数字、手势、声音等等。如1024就是个number
  • Digit是用来表达的单独符号。如0-9这是个digit就可以用来表示number,如1024就是由1、0、2、4这四个digit组成的
  @Testpublic void test4() {double myNum = 1220.0455;System.out.println("===============0的使用===============");System.out.println("只保留整数部分:" + new DecimalFormat("0").format(myNum));System.out.println("保留3位小数:" + new DecimalFormat("0.000").format(myNum));System.out.println("整数部分、小数部分都5位。不够的都用0补位(整数高位部,小数低位补):" + new DecimalFormat("00000.00000").format(myNum));System.out.println("===============#的使用===============");System.out.println("只保留整数部分:" + new DecimalFormat("#").format(myNum));System.out.println("保留2为小数并以百分比输出:" + new DecimalFormat("#.##%").format(myNum));// 非标准数字(不建议这么用)System.out.println("===============非标准数字的使用===============");System.out.println(new DecimalFormat("666").format(myNum));System.out.println(new DecimalFormat(".6666").format(myNum));}

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

3.MessageFormat:字符串格式化

MessageFormat提供了一种与语言无关(不管你在中国还是其它国家,效果一样)的方式生成拼接消息/拼接字符串的方法。使用它来构造显示给最终用户的消息。MessageFormat接受一组对象,对它们进行格式化,然后在模式的适当位置插入格式化的字符串。

简单案例

先来个最简单的使用示例体验一把:

    @Testpublic void test9() {String sourceStrPattern = "Hello {0},my name is {1}";Object[] args = new Object[]{"girl", "YourBatman"};String formatedStr = MessageFormat.format(sourceStrPattern, args);System.out.println(formatedStr);}

在这里插入图片描述

    @Testpublic void test9() {String pattern = "当前执行到:{0}{1},下一个执行第{2}{3}";for (int i = 0; i < 10; i++) {System.out.println(MessageFormat.format(pattern, new Object[]{i, "次", i + 1, "次"}));}}

在这里插入图片描述

2.参数模式

在这里插入图片描述
说明:FormatType和FormatStyle只有在传入值为日期时间、数字、百分比等类型时才有可能需要设置,使用得并不多。毕竟:我在外部格式化好后再放进去不香吗?

@Test
public void test10() {MessageFormat messageFormat = new MessageFormat("Hello, my name is {0}. I’am {1,number,#.##} years old. Today is {2,date,yyyy-MM-dd HH:mm:ss}");// 亦可通过编程式 显示指定某个位置要使用的格式化器// messageFormat.setFormatByArgumentIndex(1, new DecimalFormat("#.###"));System.out.println(messageFormat.format(new Object[]{"YourBatman", 24.123456, new Date()}));
}

在这里插入图片描述

3.注意事项

下面基于此示例,对MessageFormat的使用注意事项作出几点强调。

@Test
public void test11() {System.out.println(MessageFormat.format("{1} - {1}", new Object[]{1})); // {1} - {1}System.out.println(MessageFormat.format("{0} - {1}", new Object[]{1})); // 输出:1 - {1}System.out.println(MessageFormat.format("{0} - {1}", new Object[]{1, 2, 3})); // 输出:1 - 2System.out.println("---------------------------------");System.out.println(MessageFormat.format("'{0} - {1}", new Object[]{1, 2})); // 输出:{0} - {1}System.out.println(MessageFormat.format("''{0} - {1}", new Object[]{1, 2})); // 输出:'1 - 2System.out.println(MessageFormat.format("'{0}' - {1}", new Object[]{1, 2})); // {0} - 2// 若你数据库值两边都需要''包起来,请你这么写System.out.println(MessageFormat.format("''{0}'' - {1}", new Object[]{1, 2})); // '1' - 2System.out.println("---------------------------------");System.out.println(MessageFormat.format("0} - {1}", new Object[]{1, 2})); // 0} - 2System.out.println(MessageFormat.format("{0 - {1}", new Object[]{1, 2})); // java.lang.IllegalArgumentException: Unmatched braces in the pattern.
}

在这里插入图片描述

在这里插入图片描述

4.经典使用场景

这个就很多啦,最常见的有:HTML拼接、SQL拼接、异常信息拼接等等。

StringBuilder sb =new StringBuilder();
sb.append("insert into user (");
sb.append("		name,");
sb.append("		accountId,");
sb.append("		zhName,");
sb.append("		enname,");
sb.append("		status");
sb.append(") values (");
sb.append("		''{0}'',");
sb.append("		{1},");
sb.append("		''{2}'',");
sb.append("		''{3}'',");
sb.append("		{4},");
sb.append(")");Object[] args = {name, accountId, zhName, enname, status};// 最终SQL
String sql = MessageFormat.format(sb.toString(), args);

5.特殊使用

  1. MessageFormat可对时间、日期、数字进行更加特殊格式转化
  2. 一般使用MessageFormat只会简单的{0},如 str = “test:{0}”,但其实MessageFormat支持的不仅仅是{0},{0}只是其中一个模板写法,其全称模板如下: { ArgumentIndex , FormatType , FormatStyle }
  3. ArgumentIndex:数字0,1,2
  4. FormatType:格式化类型,支持:
    在这里插入图片描述
  5. FormatStyle:格式化风格,支持
    在这里插入图片描述

数字

   @Testpublic void test1() {// 数字String str = "test:{0,number,currency}";// 结果:test:¥1.20System.out.println(MessageFormat.format(str, 1.2));String str2 = "test:{0,number,percent}";// 结果:test:120%System.out.println(MessageFormat.format(str2, 1.2));String str3 = "test:{0,number,integer}";// 结果:test:1System.out.println(MessageFormat.format(str3, 1.2));}

在这里插入图片描述

日期

    @Testpublic void test1() {// 日期String str4 = "test:{0,date,short}";// 结果:22-12-17System.out.println(MessageFormat.format(str4, new Date()));String str5 = "test:{0,date,medium}";// 结果:2022-12-17System.out.println(MessageFormat.format(str5, new Date()));String str6 = "test:{0,date,long}";// 结果:2022年12月17日System.out.println(MessageFormat.format(str6, new Date()));String str7 = "test:{0,date,full}";// 结果:2022年12月17日 星期六System.out.println(MessageFormat.format(str7, new Date()));}

在这里插入图片描述

时间

   public void test1() {// 时间String str4 = "test:{0,time,short}";// 结果:下午2:41System.out.println(MessageFormat.format(str4, new Date()));String str5 = "test:{0,time,medium}";// 结果:14:41:52System.out.println(MessageFormat.format(str5, new Date()));String str6 = "test:{0,time,long}";// 结果:下午02时41分52秒System.out.println(MessageFormat.format(str6, new Date()));String str7 = "test:{0,time,full}";// 结果:下午02时41分52秒 CSTSystem.out.println(MessageFormat.format(str7, new Date()));}

在这里插入图片描述

在结论上补充其他更加特殊情况

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/599245.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Linux IO的奥秘:深入探索数据流动的魔法

Linux I/O&#xff08;输入/输出&#xff09;系统是其核心功能之一&#xff0c;负责处理数据在系统内部及与外界之间的流动。为了优化这一流程&#xff0c;Linux进行了一系列努力和抽象化&#xff0c;以提高效率、灵活性和易用性。&#x1f680; 1. 统一的设备模型 Linux将所…

五一假期来临,各地景区云旅游、慢直播方案设计与平台搭建

一、行业背景 经文化和旅游部数据中心测算&#xff0c;今年清明节假期3天全国国内旅游出游1.19亿人次&#xff0c;按可比口径较2019年同期增长11.5%&#xff1b;国内游客出游花费539.5亿元&#xff0c;较2019年同期增长12.7%。踏青赏花和户外徒步成为假期的热门出游主题。随着…

Linux 命令完全手册,被逼无奈开始狂啃底层技术

像这样&#xff1a; chown flavio test.txt 例如&#xff0c;假设有一个为 root 所拥有的文件&#xff0c;作为其他用户&#xff0c;你无法对它进行写入&#xff1a; 你可以使用 chown 将文件所有权转移到你&#xff1a; 一种需求十分常见&#xff1a;改变目录的所有权&#…

最优算法100例之31-正则表达式匹配

专栏主页&#xff1a;计算机专业基础知识总结&#xff08;适用于期末复习考研刷题求职面试&#xff09;系列文章https://blog.csdn.net/seeker1994/category_12585732.html 题目描述 请实现一个函数用来匹配包括.和*的正则表达式。模式中的字符.表示任意一个字符&#xff0c;而…

线程安全性问题的原因

1.抢占式执行随机调度 这里的意思就是&#xff0c;当两个线程同时启动的时候&#xff0c;两个线程会同时进行&#xff0c;并且是抢占式执行的。 而且是随机调度资源的。 如代码&#xff1a; public class Deome4 {public static void main(String[] args) {Thread t1 new …

三防平板定制服务:亿道信息与个性化生产的紧密结合

在当今数字化时代&#xff0c;个性化定制已经成为了市场的一大趋势&#xff0c;而三防平板定制服务作为其中的一部分&#xff0c;展现了数字化技术与个性化需求之间的紧密结合。这种服务是通过亿道信息所提供的技术支持&#xff0c;为用户提供了满足特定需求的定制化三防平板&a…

云原生安全当前的挑战与解决办法

云原生安全作为一种新兴的安全理念&#xff0c;不仅解决云计算普及带来的安全问题&#xff0c;更强调以原生的思维构建云上安全建设、部署与应用&#xff0c;推动安全与云计算深度融合。所以现在云原生安全在云安全领域越来受到重视&#xff0c;云安全厂商在这块的投入也是越来…

算法设计与分析(实验6)---最短增益路径法求解最大流问题

一&#xff0e;实验目的 掌握最大流算法思想。学会用最大流算法求解应用问题。 二&#xff0e;实验步骤与结果 1.上述问题可按最大流问题求解&#xff1a; 假设有医生n个&#xff0c;现要安排元旦&#xff08;共D’天&#xff09;和五一&#xff08;共D’’天&#xff09;的…

ChatGPT基础(一) GPT的前世今生

文章目录 GPT模型简史GPT系列模型ChatGPT的应用 最近ChatGPT3.5可以免注册使用了&#xff0c;出来刨一波坟 说一说ChatGPT的来源和应用。 GPT模型简史 Generative pre-trained transformers(GPT)生成式预训练转换模型是大语言模型的一种(Large Language Model–>LLM)。它是…

如何在 Windows 上安装 Jupyter Notebook?

Jupyter Notebook 是一个开源 Web 应用程序&#xff0c;可用于创建和共享包含实时代码、公式、可视化效果和叙述文本的文档。用途包括数据清理和转换、数值模拟、统计建模、数据可视化、机器学习等 在本文中&#xff0c;我们将看到使用 pip 安装在Windows上安装 Jupyter Noteb…

Java8关于Function接口

Java学习-Function接口 1 函数式接口简介和学习地址2 两种常见的函数式接口2.1 Runnable&#xff1a;执行接口&#xff0c;不接收参数&#xff0c;也无返回结果。2.2 Consumer&#xff1a;作为消费接口&#xff0c;接收一个参数&#xff0c;无返回结果。 3 初识3.1 定义Functio…

系统架构评估_2.SAAM方法

SAAM&#xff08;Scenarios-based Architecture Analysis Method&#xff09;是卡耐基梅隆大学软件工程研究所&#xff08;SEI at CMU&#xff09;的Kazman等人于1983年提出的一种非功能质量属性的架构分析方法&#xff0c;是最早形成文档并得到广泛使用的软件架构分析方法。最…