Java中的MessageFormat.format用法实例

MessageFormat本身与语言环境无关,而与用户提供给MessageFormat的模式和用于已插入参数的子格式模式有关,以生成适用于不同语言环境的消息。

MessageFormat模式(主要部分):

代码如下:

FormatElement:
         { ArgumentIndex }:是从0开始的入参位置索引。
         { ArgumentIndex , FormatType }
         { ArgumentIndex , FormatType , FormatStyle }
 
 FormatType: :指定使用不同的Format子类对入参进行格式化处理。值范围如下:
         number:调用NumberFormat进行格式化
         date:调用DateFormat进行格式化
         time:调用DateFormat进行格式化
         choice:调用ChoiceFormat进行格式化
 
 FormatStyle::设置FormatType中使用的格式化样式。值范围如下:
         short
         medium
         long
         full
         integer
         currency
         percent
         SubformatPattern (子格式模式,形如#.##)

还以str为例,在这个字符串中:
1、{0}和{1,number,short}和{2,number,#.#};都属于FormatElement,0,1,2是ArgumentIndex。
2、{1,number,short}里面的number属于FormatType,short则属于FormatStyle。
3、{1,number,#.#}里面的#.#就属于子格式模式。

指定FormatType和FormatStyle是为了生成日期格式的值、不同精度的数字、百分比类型等等。
 
实例:

1、ArgumentIndex必须是非负整数,它的个数不只限于0到9这10个,它可以用0到9的数字组成,因此可以有好多个,如:

代码如下:

String msg = "{0}{1}{2}{3}{4}{5}{6}{7}{8}"; 
Object [] array = new Object[]{"A","B","C","D","E","F","G","H","I",};        
String value = MessageFormat.format(msg, array); 
 
System.out.println(value);  // 输出:ABCDEFGHI

2、格式化字符串时,两个单引号才表示一个单引号,单个单引号会被省略,除非中文单引号不会被省略,如:

代码如下:

String value = MessageFormat.format("oh, {0} is 'a' pig", "ZhangSan"); 
 
System.out.println(value);  // 输出:oh, ZhangSan is a pig

给字母a加上单引号,如:

代码如下:

String value = MessageFormat.format("oh, {0} is ''a'' pig", "ZhangSan");

System.out.println(value);  // 输出:oh, ZhangSan is 'a' pig

如果需要显示双引号要进行转移,比如:String msg = "oh, {0} is \"a\" pig";
3、单引号会使其后面的占位符均失效,导致直接输出占位符。

代码如下:

MessageFormat.format("{0}{1}", 1, 2); // 结果12
MessageFormat.format("'{0}{1}", 1, 2); // 结果{0}{1}
MessageFormat.format("'{0}'-{1}", 1, 2); // 结果{0}-2

使用双引号和两个单引号没有关系,比如

代码如下:

String value = MessageFormat.format("oh, ''{0}'' is a pig", "ZhangSan");

System.out.println(value);  // 输出:oh, 'ZhangSan' is a pig

又比如,使用子格式模式,多了一个单引号:

代码如下:

String value = MessageFormat.format("oh, {0,number,#.#} is good num", Double.valueOf("3.1415"));

System.out.println(value);  // 输出:oh, 3.1 is good num

3、无论是有引号字符串还是无引号字符串,左花括号都是不支持的,如:

代码如下:

String value = MessageFormat.format("oh, } is good num", Double.valueOf("3.1415"));

System.out.println(value);  // 输出:oh, } is good num

如果使用左花括号会出现异常

代码如下:

String value = MessageFormat.format("oh, { is good num", Double.valueOf("3.1415"));

System.out.println(value);  // java.lang.IllegalArgumentException: Unmatched braces in the pattern.

因此要使用到左花括号需要使用单引号配合使用
MessageFormat.format("'{'{0}}", "X-rapido"); // {X-rapido}
还有一个有趣的现象,如果出现两个或2个以上左花括号,就会出现分割字符串,但是右花括号就没问题,虽然没有任何意义,实际应用我们也用不到

代码如下:

String value = MessageFormat.format("oh, {{ is good num", "d");

System.out.println(value);  // oh,

代码如下:

String value = MessageFormat.format("oh, }} is good num", "d");

System.out.println(value);  // oh, }} is good num

关于MessageFormat.format方法:
每调用一次MessageFormat.format方法,都会新创建MessageFormat的一个实例,相当于MessageFormat只使用了一次。MessageFormat类的format方法如下:

代码如下:

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

    MessageFormat temp = new MessageFormat(pattern); 
    return temp.format(arguments); 
}

因此若要多次格式同一个模式的字符串,那么创建一个MessageFormat实例在执行格式化操作比较好些

代码如下:

String message = "oh, {0} is a pig"; 
MessageFormat messageFormat = new MessageFormat(message); 
Object[] array = new Object[]{"ZhangSan"}; 
String value = messageFormat.format(array); 
 
System.out.println(value);

(0)

相关推荐

  • Java中的MessageFormat.format用法实例

    MessageFormat本身与语言环境无关,而与用户提供给MessageFormat的模式和用于已插入参数的子格式模式有关,以生成适用于不同语言环境的消息. MessageFormat模式(主要部分): 复制代码 代码如下: FormatElement:          { ArgumentIndex }:是从0开始的入参位置索引.          { ArgumentIndex , FormatType }          { ArgumentIndex , FormatType ,

  • java中静态导入机制用法实例详解

    java中静态导入机制用法实例详解 这里主要讲解了如何使用Java中静态机制的用法,这里提供了简单实例大家可以参考下. 静态常量类 在java开发中,我们会经常用到一些静态常量用于状态判断等操作.为了能够在多个地方复用这些常量,通常每个模块都会加一个常量类,举个简单的列子: import com.sky.OrderMouleConsstants; /** * Created by gantianxing on 2017/4/21. */ public class Test { public vo

  • JAVA中的final关键字用法实例详解

    本文实例讲述了JAVA中的final关键字用法.分享给大家供大家参考,具体如下: 根据上下文环境,java的关键字final也存在着细微的区别,但通常指的是"这是无法改变的."不想改变的理由有两种:一种是效率,另一种是设计.由于两个原因相差很远,所以关键子final可能被误用. 接下来介绍一下使用到final的三中情况:数据,方法,类 final数据 许多编程语言都有某种方法,来向编译器告知一块数据是恒定不变的.有时数据的恒定不变是很有用的,例如: 1. 一个编译时恒定不变的常量 2.

  • JAVA中static方法的用法实例详解

    本文实例讲述了JAVA中static方法的用法.分享给大家供大家参考,具体如下: static表示"全局"或者"静态"的意思,用来修饰成员变量和成员方法,也可以形成静态static代码块,但是Java语言中没有全局变量的概念. 被static修饰的成员变量和成员方法独立于该类的任何对象.也就是说,它不依赖类特定的实例,被类的所有实例共享.只要这个类被加载,Java虚拟机就能根据类名在运行时数据区或者方法区内找到他们.因此,static对象可以在它的任何对象创建之前访

  • java中HashSet的特点及实例用法

    1.HashSet和TreeSet区别 HashSet底层使用Hash表. 确保元素唯一性的原理:判断元素的hashCode值是否相同.如果是一样的话,会继续判断元素的equals方法是否是true. TreeSet底层采用红黑树. 确保元素的唯一性是通过Comparable或Comparator接口实现的. 2.HashSet和HashMap区别 事实上,HashSet的底层实现还是HashMap,只是它只使用了Key,具体如下: (1)在HashSet的add方法的底层,使用HashMap的

  • java arrayList遍历的四种方法及Java中ArrayList类的用法

    java arrayList遍历的四种方法及Java中ArrayList类的用法 package com.test; import java.util.ArrayList; import java.util.Iterator; import java.util.List; public class ArrayListDemo { public static void main(String args[]){ List<String> list = new ArrayList<String

  • java中最大的整数用法分析

    本文实例讲述了java中最大的整数用法.分享给大家供大家参考,具体如下: 8种基本数据类型中,long类型所能表示的整数范围是最大的,但还是有限的.另外,基本数据类型中的整数还有一个问题,那就是不是每个数都能够正确的取负数.例如,对int型而言,"-2147483648"取负就不能得到正确的结果,对其他整数类型也有这个问题. 为了解决这些问题,Java中专门提供了用来进行不限制大小的整数计算的类--java.math.BigInteger.该类可以对任意大小的整数进行操作,不过在进行计

  • java 中ThreadLocal 的正确用法

    java 中ThreadLocal 的正确用法 用法一:在关联数据类中创建private static ThreadLocalThreaLocal的JDK文档中说明:ThreadLocal instances are typically private static fields in classes that wish to associate state with a thread.如果我们希望通过某个类将状态(例如用户ID.事务ID)与线程关联起来,那么通常在这个类中定义private s

  • python中强大的format函数实例详解

    python中format函数用于字符串的格式化 自python2.6开始,新增了一种格式化字符串的函数str.format(),此函数可以快速处理各种字符串. 语法 它通过{}和:来代替%. 请看下面的示例,基本上总结了format函数在python的中所有用法 #通过位置 print '{0},{1}'.format('chuhao',20) print '{},{}'.format('chuhao',20) print '{1},{0},{1}'.format('chuhao',20) #

  • 简单介绍java中equals以及==的用法

    简单介绍 equals方法是java.lang.Object类的方法有两种用法说明: 一.对于字符串变量来说,使用"=="和"equals()"方法比较字符串时,其比较方法不同. 1."=="比较两个变量本身的值,即两个对象在内存中的首地址.(java中,对象的首地址是它在内存中存放的起始地址,它后面的地址是用来存放它所包含的各个属性的地址,所以内存中会用多个内存块来存放对象的各个参数,而通过这个首地址就可以找到该对象,进而可以找到该对象的各个属

随机推荐