java实现字符串模板格式化方法和注意事项

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

一、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);

 

  • 4
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值