`
y806839048
  • 浏览: 1108273 次
  • 性别: Icon_minigender_1
  • 来自: 上海
文章分类
社区版块
存档分类
最新评论

MessageFormat与占位符

阅读更多

 

{}的数字代表了相应顺序位置的参数

应用于短信,参数模板的使用方法(尤其是定时任务)

 

参数模板的话后面应用的时候用split--用这个主要是存在公用的参数

 

 

参数模板的示例:

 

 

 

taskparam.openAccountNotify={0}|0|300|1800|2|5||{1}||||SUCCESS||||2

 

@Value("${jdan.taskparam.openAccountNotify}")

private String openAccountNotify;

 

{0}|   --》对应位数      0

0|       --》    1

300|     --》     2

1800|    --》    3

2|         --》  4

5|         --》  5

|         --》   6

{1}|     --》    7

|         --》   8

|         --》   9

|           --》 10

SUCCESS|  --》  11

|           --》 12

|          --》  13

|          --》  14

2         --》   15

 

String taskParams = MessageFormat.format(openAccountNotify, "confirmLoanUrl", JSON.toJSONString(confirmLoan));//???

String[] p = taskParams.split("\\|");

TaskParam taskParam = new TaskParam();

taskParam.setTaskUrl(p[0]);

taskParam.setWaitingTime(p[1]);

taskParam.setPeriod(p[2]);

taskParam.setPartDelay(p[3]);

taskParam.setPartCount(p[4]);

taskParam.setExecutionCount(p[5]);

taskParam.setArgs(p[7]);

taskParam.setSuccessCdn(p[11]);

taskParam.setHttpType(p[15]);

sendTaskUtil.sendTask(taskParam);

 

源码:

public static String format(String pattern, Object ... arguments) {

        MessageFormat temp = new MessageFormat(pattern);

        return temp.format(arguments);

    }

 

 

 

=============理论知识==============

如果一个字符串文本中包含了多个与国际化相关的数据,可以使用MessageFormat类对这些数据进行批量处理。

  例如:

  在201619的时候,一场台风导致了500间房屋的摧毁和1000000元人民币的损失。

  在上面这句话中,包含了时间、数字和货币等多个与国家化相关的数据,已经用下划线标出,而我们可以使用MessageFormat对这句话中多个数据进行批量处理。

  要想使用MessageFormat进行批量处理,就要使用到占位符,用占位符替换上面的数据(不需要写死的数据或者与国际化相关的数据)。占位符由花括号{}和在花括号中的数字组成,数字代表这是第几个占位符,现在我们对上面的那个示例使用占位符:

  在{0}的时候,一场台风导致了{1}间房屋的摧毁和{2}元人民币的损失。

   经过占位符修改的字符串文本也称为模式字符串,如上面这句话,有了模式字符串后,我们需要一个对象数组来指定每个占位符对应的数据,在数组中的位置就对应着其相同位置的占位符。现在拥有了模式字符串和对象数组后,我们就可以使用MessageFormat对象的format方法,将数组中的数据一一对应到占位符上了。

  占位符由三种书写格式:

  ① {index}:index为0~9之间的数字,对应对象数组中的位置。

  ② {index,formatType}:index为0~9之间的数字,formatType为参数的格式化类型

  ③  {index,formatType,formatStyle}:formatStyle为参数的格式化样式。

有关占位符的使用稍后说明。

         注:在创建MessageFormat对象时可以直接将模式字符串以参数传入构造器,也可以直接使用MessageFormat的静态方法format(String pattern , Object …params)只执行一次。

 

例1:

1     String pattern = "在{0}的时候,一场台风导致了{1}间房屋的摧毁和{2}元人民币的损失。";
2     Object[] params = {new Date(),500,1000000};
3     MessageFormat mf = new MessageFormat(pattern);
4     String content = mf.format(params);
5     System.out.println(content);

上述代码等同于:

1     String pattern = "在{0}的时候,一场台风导致了{1}间房屋的摧毁和{2}元人民币的损失。";
2     Object[] params = {new Date(),500,1000000};
3     String content = MessageFormat.format(pattern, params);
4     System.out.println(content);

输出:

  

结果就是:在16-1-9 下午7:56的时候,一场台风导致了500间房屋的摧毁和1,000,000元人民币的损失。

  可以看到在对应的占位符上,我们用对象数组中的内容替代了占位符。但是似乎和最开始我们规定的字符串文本有点不同?

 最开始我们规定的文本:

  在201619的时候,一场台风导致了500间房屋的摧毁和1,000,000元人民币的损失。

例1占位符被替代后的文本:

  在16-1-9 下午7:56的时候,一场台风导致了500间房屋的摧毁和1,000,000元人民币的损失。

 

  可以看到日期格式和货币格式跟我们规定的不同,而这一点可以想到前一篇博客我们学到的DateFormat和NumberFormat中可以指定日期/时间或货币的输出格式。而这里我们要先了解下占位符:

  占位符有三种书写格式:

  ① {index}:index为0~9之间的数字,对应对象数组中的位置。

  ② {index,formatType}:index为0~9之间的数字,formatType为参数的格式化类型

  ③ {index,formatType,formatStyle}:formatStyle为参数的格式化样式,该样式必须是格式化类型相匹配的合法模式,或表示合法模式的字符串。

  在Java的API关于MessageFormat中,已经定义了formatType和formatStyle能使用的参数有哪些:

  

  通过上图我们就明白了formatType和formatStyle到底能使用哪些值,比如formatType如果我选了“date”,就代表该占位符是一个日期,那么可以指定formatStyle(使用占位符第三种书写方式),也就是DateFormat的日期显示格式;当然也可以不指定(使用占位符第二种书写方式),那么该DateFormat就采用默认(MEDIUM)的日期显示格式。如果formatType选择为“number”也是一样的道理。如果对DateFormat和NumberFormat不熟悉的可以看上一篇博客《国际化之DateFormat、NumberFormat》 。

总结:

  formatType如果使用“date”,那么就是采用DateFormat类的getDateInstance方法获取只关于日期的DateFormat类实例对象,根据formatStyle来获取日期输出格式。

  formatType如果使用“time”,那么就是采用DateFormat类的getTimeInstance方法获取只关于时间的DateFormat类实例对象,根据formatStyle来获取时间输出格式。

  formatType如果使用“number”,如果也指定了formatStyle为“currency”,那么就是调用了NumberFormat的getCurrencyInstance方法获取有关于货币格式的NumberFormat类对象。

  当然通过上图还可以获得很多对象,还有其他类型的格式转换器类,比如SimpleDateFormat等等,具体根据上图和实际情况满足需求即可。

 

例2:

复制代码
1     String pattern = "在{0,date,long}的时候,一场台风导致了{1}间房屋的摧毁和{2,number,currency}元人民币的损失。";
2     Object[] params = {new Date(),500,1000000};
3         
4     String content = MessageFormat.format(pattern, params);
5     System.out.println(content);
复制代码

输出:

  

结果就是:在2016年1月9日的时候,一场台风导致了500间房屋的摧毁和¥1,000,000.00元人民币的损失。

  可以看到这就跟我们的最开始定义的字符串文本相同了。

  占位符在框架中是经常被使用到的,当然占位符一般不会在程序代码中被使用,而是在资源文件properties被使用,这是想Struts2这样的框架经常被使用到的,结合前两篇的《国际化之ResourceBundle》,如果模式字符串在properties中使用,那么我们需要通过ResourceBundle通过资源文件的基名获取对象,并使用getString方法获取模式字符串,最后只要使用MessageFormat像上面一样处理就行了。

 

例3:

  在工程中用一个包来封装一组资源包,该组资源包中默认的资源配置文件基名为“MessageResource”,同时配有中文和英文两个资源配置文件,如下图所示:

  

在默认的资源文件“MessageResource.properties”中定义的内容如下:

  

在中文资源文件“MessageResource_zh.properties”中定义的内容如下:

  

  英文资源文件和默认资源文件中的内容是一样的,这里就不再贴出。

  因为我们将资源文件放在包中,所以基名应该包括包名,这一点在博文《《国际化之ResourceBundle》中已经说明。

 

在程序中代码如下:

复制代码
1     ResourceBundle bundle = ResourceBundle.getBundle("com.fjdingsd.resource.MessageResource",Locale.CHINA);
2     String pattern = bundle.getString("message");  //获取模式字符串
3     Object[] params = {new Date(),500,10000000};
4         
5     String content = MessageFormat.format(pattern, params);
6     System.out.println(content);
复制代码

输出:在16-1-9 下午8:59的时候,一场台风导致了500间房屋的摧毁和10,000,000元人民币的损失。

注意:⑴ 这里占位符对应的地方格式并不友好,这是因为占位符没有使用特定的格式,参见例2。

   ⑵ 在ResourceBundle获取对象中使用到了Locale是以中国的形式,因此最后输出的是中文,如果想以美国作为Locale,那么将会输出英文:

修改代码为:

复制代码
1     ResourceBundle bundle = ResourceBundle.getBundle("com.fjdingsd.resource.MessageResource",Locale.US);
2     String pattern = bundle.getString("message"); //获取模式字符串
3     Object[] params = {new Date(),500,10000000};
4         
5     String content = MessageFormat.format(pattern, params);
6     System.out.println(content);
复制代码

输出:On 16-1-9 下午9:03, a typhoon destory 500 houses and caused 10,000,000 of damage.

  看上去似乎很正确,但是在这些英文中出现了中文,而且是在占位符对应的地方,说明我们还未将MessageFormat对象的代表的语言国家环境修改,最终代码如下:

复制代码
1     ResourceBundle bundle = ResourceBundle.getBundle("com.fjdingsd.resource.MessageResource",Locale.US);
2     String pattern = bundle.getString("message");  //获取模式字符串
3     Object[] params = {new Date(),500,10000000};
4         
5     MessageFormat mf = new MessageFormat(pattern, Locale.US);
6     String content = mf.format(params);
7     System.out.println(content);
复制代码

输出:On 1/9/16 9:07 PM, a typhoon destory 500 houses and caused 10,000,000 of damage.

 

 

分享到:
评论

相关推荐

    解决Spring国际化文案占位符失效问题的方法

    在Spring中,MessageSource使用MessageFormat来解析国际化文案中的占位符,但是有时候MessageFormat可能不会正确地替换占位符,导致文案显示不正确。 解决这种问题的方法是了解MessageFormat的解析机制,了解它是...

    Java占位符三种方案一起时间性能对比

    `MessageFormat` 类是Java的一个高级格式化工具,它提供了更复杂的模板语法,可以处理更复杂的占位符结构。例如: ```java String pattern = "Name: {0}, Age: {1}"; Object[] args = {"John", 30}; String ...

    Java利用MessageFormat实现短信模板的匹配

    MessageFormat的格式化是基于一个模板字符串,其中包含一些占位符,如{0}、{1}等,这些占位符将被实际值所替换。 现在,让我们来看一下如何使用MessageFormat实现短信模板的匹配。假设我们需要生成一个短信模板,...

    Java中的MessageFormat.format用法实例

    3. 单引号的存在会影响占位符的解析,如果前面有一个单引号,那么紧跟的占位符将不再被替换。例如,`"'{0}{1}"`将输出`"{0}{1}"`,而`"'{0}'-{1}"`会将第二个占位符`{1}`替换为第二个参数的值。 4. 对于双引号的...

    前端项目-intl-messageformat.zip

    3. **格式化消息**:使用`format`方法,传入一个包含替换占位符的对象,即可生成本地化的字符串。例如: ```javascript const formattedMessage = message.format({ count: 5 }); // 结果:'你有5条未读消息' ``...

    解析消息字符串IntlMessageformatParser.zip

    在`IntlMessageformatParser`中,生成的AST包含了消息字符串的所有结构信息,包括占位符的位置、类型等,这为后续的格式化提供了便利。 当AST构建完成后,我们可以使用它来格式化消息。`IntlMessageformatParser`...

    前端项目-angular-translate-interpolation-messageformat.zip

    它允许开发者定义动态占位符和规则,以便根据上下文和变量值生成不同的输出。例如,你可以根据数字、日期、时间或者用户自定义的逻辑来生成不同的翻译字符串。 在Angular Translate中集成MessageFormat插件,可以...

    JavaWeb项目网上书店.rar

    一、国际化的相关知识 1、什么是国际化。 程序只有一套,能根据来访者的阅读习惯显示相应的文本、日期时间... 占位符:aaaa{索引,类型,样式} 索引:0... 类型:date、time、number等 样式: 6、JSTL中的fmt标签

    MyBatis MapperProvider MessageFormat拼接批量SQL语句执行报错的原因分析及解决办法

    当业务量猛增,同时执行大量插入操作时,MyBatis在尝试解析这个动态生成的SQL时,由于`MessageFormat`生成的占位符格式不正确(即`#{list[0].lotCode}`这样的形式),导致了`BuilderException`,提示参数映射格式不...

    dotnet-MessageFormatNETNET的ICUMessageFormat实现

    1. **参数化格式化**:通过使用占位符(如"{0}"、"{1}"等)和参数类型(如"G"代表日期,"n"代表数字),MessageFormat.NET可以将任意复杂的消息模板与数据相结合,生成本地化的输出。 2. **类型安全**:不同于简单...

    java 国际化说明

    在程序中,可以使用`MessageFormat`来格式化这个字符串,将占位符`{0}`和`{1}`替换成实际的用户名和时间戳: ```java String loginSuccessMsg = rb.getString("login_success"); Object[] args = {"张三", new Date...

    javaweb 国际化:DateFormat,NumberFormat,MessageFormat,ResourceBundle的使用

    5. 使用MessageFormat类来格式化含有占位符的消息; 6. 将这些类和资源包组合在一起,实现对多语言用户界面的支持。 例如,如果我们有一个资源文件"messages.properties"定义了用户界面的文本,同时我们还准备了...

    java类Formatter解析.pdf

    另外,MessageFormat类允许你创建包含占位符的字符串模板,并且可以按照指定的模式插入不同数据类型的值。如示例中的代码片段所示,使用MessageFormat类可以方便地对消息中的占位符进行格式化。 在Formatter类的...

    投策国际化Lawrence version.xlsx

    Ø java.text.MessageFormat:用于格式化带占位符的字符串。 为了实现程序的国际化,必须先提供程序所需要的资源文件。资源文件的内容是很多key-value对。其中key是程序使用的部分,而value则是程序界面的显示字符...

    Java 实例 - 字符串格式化源代码-详细教程.zip

    这个方法允许我们创建具有占位符的格式字符串,并用实际值替换这些占位符。例如: ```java String name = "Alice"; int age = 25; String formattedStr = String.format("我的名字是 %s,今年%d岁。", name, age); ...

    美河原创视频Struts 2.0视频配套PPT

    - 当需要填充占位符时,可以借助Java的MessageFormat类,它提供了一种灵活的方式来格式化输出,对应于资源文件中的占位符。 7. **用户选择语言**: - 用户可以通过界面选择语言,开发人员可以在Action中调用 `...

    java中的format.pdf

    - 允许在字符串中使用占位符(如"{0}","{1}"),然后使用提供的参数替换这些占位符。 - 例如,`MessageFormat.format("Hello, {0}! Today is {1}.", "John", "Monday")`会返回"Hello, John! Today is Monday."。 ...

    软件质量保证与测试——静态白盒测试 (1).pdf

    对于`String.format()`的错误,我们需要调整字符串格式,确保占位符与参数匹配。对于`Random`对象的创建,若只使用一次,可以考虑将其作为局部变量,以避免不必要的资源消耗。 静态白盒测试的优点在于可以在早期...

    小知识点i18n,关于国际化处理

    它允许开发者定义一个模板,其中包含占位符,然后在运行时用实际值替换这些占位符。这样可以确保日期、数字和其他类型的格式符合特定地区的习惯。例如,"今天是{0}",其中{0}可能是日期,根据Locale的不同,可以显示...

    09 Spring IoC容器ApplicationContext如何实现国际化慕课专栏1

    2. MessageFormat:格式化输出字符串,处理占位符。 3. ResourceBundle.Control:自定义加载策略,以优化资源文件的查找。 理解这些基本概念和机制后,我们可以灵活地在Spring应用中实现国际化,为全球用户提供更加...

Global site tag (gtag.js) - Google Analytics