MessageFormat:格式化字符串

news/2024/11/24 22:42:12/

需求

有一个字符串:"[张三]负责的位置[东厂房]发生[烟雾]报警,请[张三]及时前往处理。"。实际需要对[]内的内容进行替换。如果调用String.replace(),那需要执行多次。而使用MessageFormat.format,则可以替换一次即可获取目标字符串:

String[] args = { "张三", "东厂房", "烟雾" };
String info = MessageFormat.format("[{0}]负责的位置[{1}]发生[{2}]报警,请[{0}]及时前往处理。", args);

MessageFormat.format()

MessageFormat.format()由jdk提供,可对字符串进行格式化。
MessageFormat.format(String pattern, Object ... arguments)的参数:

  • pattern:模板字符串。其中需要使用{ArgumentIndex }的形式标记要替换的内容(FormatElement)。ArgumentIndex从0开始,表示替换为arguments的ArgumentIndex索引元素。
  • arguments:替换参数,是个Object数组。

例如:

String info = MessageFormat.format("{0}是{1}", "天", "蓝色"); // 天是蓝色

其中{0}即为FormatElement,有3种格式:

  • { ArgumentIndex }
  • { ArgumentIndex, FormatType }
  • { ArgumentIndex, FormatType, FormatStyle }

在3种格式中,有3个参数:

  • ArgumentIndex :arguments的索引。

  • FormatType:FormatElement的格式化类型。若要按String进行格式化格式化,不传入该参数。但若需要按其他数据类型格式化,有4种取值:

    • number:数值。使用NumberFormat处理。
    • date:日期。使用DateFormat处理。
    • time:时间。使用DateFormat处理。
    • choice:键值对。使用ChoiceFormat处理。
  • FormatStyle:格式化类型的具体样式,用于对FormatType进行细化。取值为:

    • short
    • medium
    • long
    • full
    • integer
    • currency
    • percent
    • SubformatPattern:子格式。需指定格式串。

例如:

// number
MessageFormat.format("{0, number, #.##}", 1.2345f); // 1.23
MessageFormat.format("{0, number, currency}", 1.23); // ¥1.2
MessageFormat.format("{0, number, percent}", 1.23); // 123%Date date = new Date();// date
MessageFormat.format("{0, date}", date); // 2023-11-15MessageFormat.format("{0, date, short}", date); // 23-11-15
MessageFormat.format("{0, date, medium}", date); // 2023-11-15
MessageFormat.format("{0, date, long}", date); // 2023年11月15日
MessageFormat.format("{0, date, full}", date); // 2023年11月15日 星期三MessageFormat.format("{0, date, yyyy-MM-dd}", date); // 2023-11-15
MessageFormat.format("{0, date, yyyy-MM-dd HH:mm:ss}", date); // 2023-11-15 15:00:00// time
MessageFormat.format("{0, time}", date); // 15:00:00
MessageFormat.format("{0, time}", date.getTime()); // 15:00:00
MessageFormat.format("{0, time, short}", date); // 下午3:00
MessageFormat.format("{0, time, medium}", date); // 15:00:00
MessageFormat.format("{0, time, long}", date); // 下午03时00分00秒
MessageFormat.format("{0, time, full}", date); // 下午03时00分00秒 CST
MessageFormat.format("{0, time, HH:mm}", date); // 15:00

关于choice则需定义size相同的两个数组:double和String数组来进行映射。可参考ChoiceFormat的用法。

特殊字符"{"

MessageFormat有2个特殊字符:{'
'用于标记特殊字符,使用2个'将特殊字符包裹起来即可。注意如果只有一个'则会被忽略。
MessageFormat默认是将{n}作为占位符,其解析时先识别{,因此{是个特殊字符。如果有非占位符的{,需要使用2个'将其包裹起来。}不是特殊字符,如果没有{仅有},则会正常输出。

最佳实践

MessageFormat.format()的源码为:

public static String format(String pattern, Object ... arguments) {MessageFormat temp = new MessageFormat(pattern);return temp.format(arguments);
}

可见其创建了一个新的MessageFormat对象。
如果需要对相同格式的字符串多次格式化,那么建议暂存一个MessageFormat对象来多次使用。


http://www.ppmy.cn/news/1219586.html

相关文章

了解一下知识付费系统的开发流程和关键技术点

知识付费系统的开发既涉及到前端用户体验,又需要强大的后端支持和复杂的付费逻辑。在这篇文章中,我们将深入探讨知识付费系统的开发流程和关键技术点,并提供一些相关的技术代码示例。 1. 需求分析和规划: 在着手开发知识付费系…

k8s 对外服务之 Ingress( LB + ingress)

Ingress 理论 Ingress 简介 service的作用体现在两个方面,对集群内部,它不断跟踪pod的变化,更新endpoint中对应pod的对象,提供了ip不断变化的pod的服务发现机制;对集群外部,他类似负载均衡器,可…

Netty Review - 核心组件扫盲

文章目录 PreNetty Reactor 的工作架构图CodePOMServerClient Netty 重要组件taskQueue任务队列scheduleTaskQueue延时任务队列Future异步机制Bootstrap与ServerBootStrapgroup()channel()option()与childOption()ChannelPipelinebind()优雅地关闭EventLoopGroupChannleChannel…

ARM64 linux并发与同步之内存屏障

1.2 内存屏障 1.2.1 概念理解 原理部分比较苦涩难懂,我们先不过多详细介绍这部分的由来和经过,接下来着重讲解什么用途和实现; ARM64架构中提供了3条内存屏障指令。 数据存储屏障(Data Memory Barrier, DMB)指令。数据同步屏障(Data Synch…

P1260 工程规划

工程规划 题目描述 造一幢大楼是一项艰巨的工程,它是由 n n n 个子任务构成的,给它们分别编号 1 , 2 , ⋯ , n ( 5 ≤ n ≤ 1000 ) 1,2,\cdots,n\ (5≤n≤1000) 1,2,⋯,n (5≤n≤1000)。由于对一些任务的起始条件有着严格的限制,所以每个…

指针传2

几天没有写博客了,怎么说呢?这让我总感觉缺点什么,心里空落落的,你懂吧! 好了,接下来开始我们今天的正题! 1. ⼆级指针 我们先来看看代码: 首先创建了一个整型变量a,将…

什么是基因表达谱分析及其相关概念

目录 相关概念1. 转录本2. 什么是L1000技术 相关概念 1. 转录本 转录本(transcript)是指在基因表达中产生的RNA分子。基因是DNA上的一段特定序列,通过基因表达,该DNA序列的信息被转录为RNA。转录本是这个转录过程的产物&#xff…

Spring6(一):入门案例

文章目录 1. 概述1.1 Spring简介1.2 Spring 的狭义和广义1.3 Spring Framework特点1.4 Spring模块组成 2 入门2.1 构建模块2.2 程序开发2.2.1 引入依赖2.2.2 创建java类2.2.3 创建配置文件2.2.4 创建测试类测试 2.3 程序分析2.4 启用Log4j2日志框架2.4.1 引入Log4j2依赖2.4.2 加…