GirlsBoy
回首向来萧瑟处,归去,也无风雨也无晴。
posts - 36,comments - 1,views - 12万

多语言编程过程中,字符串模板替换是一个非常常用的功能,其实现方式也各有千秋,下面介绍几种比较常用的模板替换方式

  • 一、String.format

  此方法是jdk中String类中的一个静态方法,通过占位符方式实现字符串内容替换方案,其中占位符包括如下

%s : 表示字符串类型的占位符。
%d : 表示整型数值(十进制)的占位符。
%x : 表示十六进制数值的占位符。
%f : 表示浮点数的占位符。
%e : 表示科学记数法表示的浮点数。
%c : 表示单个字符。
%t : 时间/日期相关的格式,后面可以接具体的格式化代码如%tY表示四位数的年份,%tm表示月份等。
%% : 表示输出一个百分号(%)自身。

  使用方式为

String.format("i am a %s,i am %s years old","man",12)

  该种方式使用方便,通过正则替换方式实现。简单的替换容易实现,可用于布局调整,对齐,数字、文本、日期等格式替换,但在使用过程中要注意,占位符必须与替换内容格式相对应,否则会抛出IllegalFormatConversionException异常。

  • 二、MessageFormat.format()

  MessageFormat处理多语言环境字符串功能非常强,其通过占位符参数索引方式实现字符串内容替换,在模板字符串中,使用 {index} 形式的占位符来标记要替换的部分,其中 index 是参数的位置。例如,"{0}" 表示第一个参数,"{1}" 表示第二个参数,以此类推。这些占位符可以与特定语言的文本混合,以适应不同语言的语序和语法习惯。同时,还支持本地化、格式化输出、复数等。

  使用方式如下

复制代码
MessageFormat.format("i am a {0},i am {1} years old,now time is {2,date}.","man",18,new Date())
//替换结果:i am a man,i am 18 years old,now time is 2024年5月9日.
MessageFormat.format("i have {0,choice,1#one mobile phone|1<mobile mobile phones}",1)
//替换结果:i have one mobile phones
MessageFormat.format("i have {0,choice,1#one mobile phone|1<many mobile phones}",8)
//替换结果:i have many mobile phones
复制代码

  注意事项

  如果被转义字符串中包含单引号',需要特别注意,单引号的存在会影响转义结果的正确性,如

MessageFormat.format("it's a {0}","apple")
//替换结果:it's a {0}

  解决方案

  一、单引号转义

MessageFormat.format("'it''s a '{0}'","apple")
//替换结果:it's a apple

 

  二、单引号替换

复制代码
String pattern = "it's a {0}";
pattern = pattern.replaceAll("'","&&&");
String returnVal = MessageFormat.format(pattern,"apple");
returnVal = returnVal.replaceAll("&&&","'");
//替换结果:it's a apple
复制代码
  • 三、其他方式

  处理比较复杂的模板处理,可以使用模板引擎如FreeMarker等

Configuration cfg = new Configuration(Configuration.VERSION_2_3_30);
cfg.setDirectoryForTemplateLoading(new File("D:\\templates"));
Template template = cfg.getTemplate("test.ftl");
Map<String, String> data = new HashMap<>();
data.put("name", "pike");
Writer out = new OutputStreamWriter(System.out);
template.process(data, out);

 

 

posted on   GirlsBoy  阅读(1677)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· Manus的开源复刻OpenManus初探
· AI 智能体引爆开源社区「GitHub 热点速览」
· 三行代码完成国际化适配,妙~啊~
· .NET Core 中如何实现缓存的预热?
< 2025年3月 >
23 24 25 26 27 28 1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28 29
30 31 1 2 3 4 5

java\web应用开发&研究

梦想程序改变生活

成为一个了不起的人

点击右上角即可分享
微信分享提示