IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> Java知识库 -> MessageFormat的用法 -> 正文阅读

[Java知识库]MessageFormat的用法

简介

MessageFormat最广泛的用法是在字符串中用{}表示占位符进行填充,常用于错误处理国际化中。{0}表示后面传入参数的第一个参数

使用

  • format(Object obj)成员方法
   public static void testMessageFormat() {
        String object = "程序员职业生涯是{0}和{1}之间";
        MessageFormat format = new MessageFormat(object);
        String result = format.format(new String[]{"22", "33"});
        System.out.println(result);
   }

输出:

程序员职业生涯是22和33之间

注意,这里必须将参数放在一个数组中,且数组中的成员有toString()方法可以转换为String类型,即这里的数组不能是基本类型的数组,否则会报java.lang.ClassCastException:

    public static void testMessageFormat1() {
        String object = "程序员职业生涯是{0}和{1}之间";
        MessageFormat format = new MessageFormat(object);
        String result = format.format(new int[]{22, 33});
        System.out.println(result);
    }

输出

java.lang.ClassCastException: class [I cannot be cast to class [Ljava.lang.Object; ([I and [Ljava.lang.Object; are in module java.base of loader 'bootstrap')
  at line 885, java.base/java.text.MessageFormat.format
  at line 158, java.base/java.text.Format.format
  at line 25, Main.testMessageFormat1
  at line 5, Main.main

因为format()MessageFormat的抽象父类Format的方法,里面调用了抽象方法format(Object arguments, StringBuffer result, FieldPosition pos)

    /**
     * Formats an object to produce a string. This is equivalent to
     * <blockquote>
     * {@link #format(Object, StringBuffer, FieldPosition) format}<code>(obj,
     *         new StringBuffer(), new FieldPosition(0)).toString();</code>
     * </blockquote>
     *
     * @param obj    The object to format
     * @return       Formatted string.
     * @exception IllegalArgumentException if the Format cannot format the given
     *            object
     */
    public final String format (Object obj) {
        return format(obj, new StringBuffer(), new FieldPosition(0)).toString();
    }

MessageFormat实现了format(Object arguments, StringBuffer result, FieldPosition pos)方法,subformat()方法会将arguments强制转换为(Object[]),此时基本类型int[] 本身是一个object对象,不能转为obejct[],所以报ClassCastException。之后subformat()方法逐一判断是不是nullNumberDateString,如果都不是会尝试调用arg = obj.toString()方法。

    public final StringBuffer format(Object arguments, StringBuffer result,
                                     FieldPosition pos)
    {
        return subformat((Object[]) arguments, result, pos, null);
    }
    private StringBuffer subformat(Object[] arguments, StringBuffer result,
                                   FieldPosition fp, List<AttributedCharacterIterator> characterIterators) {
        // note: this implementation assumes a fast substring & index.
        // if this is not true, would be better to append chars one by one.
		// 忽略
         if (false) { // if (argRecursion == 3){
             // prevent loop!!!
             result.append('\uFFFD');
         } else {
             Object obj = arguments[argumentNumber];
             String arg = null;
             Format subFormatter = null;
             if (obj == null) {
                 arg = "null";
             } else if (formats[i] != null) {
                 subFormatter = formats[i];
                 if (subFormatter instanceof ChoiceFormat) {
                     arg = formats[i].format(obj);
                     if (arg.indexOf('{') >= 0) {
                         subFormatter = new MessageFormat(arg, locale);
                         obj = arguments;
                         arg = null;
                     }
                 }
             } else if (obj instanceof Number) {
                 // format number if can
                 subFormatter = NumberFormat.getInstance(locale);
             } else if (obj instanceof Date) {
                 // format a Date if can
                 subFormatter = DateFormat.getDateTimeInstance(
                          DateFormat.SHORT, DateFormat.SHORT, locale);//fix
             } else if (obj instanceof String) {
                 arg = (String) obj;

             } else {
                 arg = obj.toString();
                 if (arg == null) arg = "null";
             }
		// 忽略
        return result;
    }
  • MessageFormat.format(String pattern Object... arguments)静态方法
    public static void testMessageFormat2() {
        String object = "程序员职业生涯是{0}和{1}之间";
        String result = MessageFormat.format(object,22, 33);
        System.out.println(result);
    }

输出:

程序员职业生涯是22和33之间
  Java知识库 最新文章
计算距离春节还有多长时间
系统开发系列 之WebService(spring框架+ma
springBoot+Cache(自定义有效时间配置)
SpringBoot整合mybatis实现增删改查、分页查
spring教程
SpringBoot+Vue实现美食交流网站的设计与实
虚拟机内存结构以及虚拟机中销毁和新建对象
SpringMVC---原理
小李同学: Java如何按多个字段分组
打印票据--java
上一篇文章      下一篇文章      查看所有文章
加:2021-10-13 11:19:57  更:2021-10-13 11:21:07 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/23 22:02:45-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码