zoukankan      html  css  js  c++  java
  • String.format()详解一

    String.format()字符串常规类型格式化的两种重载方式

    • format(String format, Object… args) 新字符串使用本地语言环境,制定字符串格式和参数生成格式化的新字符串。
    • format(Locale locale, String format, Object… args) 使用指定的语言环境,制定字符串格式和参数生成格式化的字符串。

    上个栗子有用到了字符类型和整数类型的格式化 下面我把常用的类型例举出来

    为了方便理解还是举个例子

       String str=null;  
        str=String.format("Hi,%s", "小超");  
        System.out.println(str);  
        str=String.format("Hi,%s %s %s", "小超","是个","大帅哥");            
        System.out.println(str);                           
        System.out.printf("字母c的大写是:%c %n", 'C');  
        System.out.printf("布尔结果是:%b %n", "小超".equal("帅哥"));  
        System.out.printf("100的一半是:%d %n", 100/2);  
        System.out.printf("100的16进制数是:%x %n", 100);  
        System.out.printf("100的8进制数是:%o %n", 100);  
        System.out.printf("50元的书打8.5折扣是:%f 元%n", 50*0.85);  
        System.out.printf("上面价格的16进制数是:%a %n", 50*0.85);  
        System.out.printf("上面价格的指数表示:%e %n", 50*0.85);  
        System.out.printf("上面价格的指数和浮点数结果的长度较短的是:%g %n", 50*0.85);  
        System.out.printf("上面的折扣是%d%% %n", 85);  
        System.out.printf("字母A的散列码是:%h %n", 'A');

    输出结果

    Hi,小超 
    Hi,小超 是个 大帅哥  
    字母c的大写是:C   
    布尔的结果是:false   
    100的一半是:50   
    100的16进制数是:64   
    100的8进制数是:144   
    50元的书打8.5折扣是:42.500000 元  
    上面价格的16进制数是:0x1.54p5   
    上面价格的指数表示:4.250000e+01   
    上面价格的指数和浮点数结果的长度较短的是:42.5000   
    上面的折扣是85%   
    字母A的散列码是:41

    ###搭配转换符还有实现高级功能 第一个例子中有用到 $

    标志说明示例结果
    + 为正数或者负数添加符号 (“%+d”,15) +15
    0 数字前面补0(加密常用) (“%04d”, 99) 0099
    空格 在整数之前添加指定数量的空格 (“% 4d”, 99) 99
    , 以“,”对数字分组(常用显示金额) (“%,f”, 9999.99) 9,999.990000
    ( 使用括号包含负数 (“%(f”, -99.99) (99.990000)
    # 如果是浮点数则包含小数点,如果是16进制或8进制则添加0x或0 (“%#x”, 99)(“%#o”, 99) 0x63 0143
    < 格式化前一个转换符所描述的参数 (“%f和%<3.2f”, 99.45) 99.450000和99.45
    d,%2$s”, 99,”abc”) 99,abc    

    第一个例子中有说到 %tx x代表日期转换符 我也顺便列举下日期转换符

    标志说明示例
    c 包括全部日期和时间信息 星期六 十月 27 14:21:20 CST 2007
    F “年-月-日”格式 2007-10-27
    D “月/日/年”格式 10/27/07
    r “HH:MM:SS PM”格式(12时制) 02:25:51 下午
    T “HH:MM:SS”格式(24时制) 14:28:16
    R “HH:MM”格式(24时制) 14:28

    来个例子方便理解

    Date date=new Date();                                  
        //c的使用  
        System.out.printf("全部日期和时间信息:%tc%n",date);          
        //f的使用  
        System.out.printf("年-月-日格式:%tF%n",date);  
        //d的使用  
        System.out.printf("月/日/年格式:%tD%n",date);  
        //r的使用  
        System.out.printf("HH:MM:SS PM格式(12时制):%tr%n",date);  
        //t的使用  
        System.out.printf("HH:MM:SS格式(24时制):%tT%n",date);  
        //R的使用  
        System.out.printf("HH:MM格式(24时制):%tR",date);

    输出结果

    全部日期和时间信息:星期三 九月 21 22:43:36 CST 2016-月-日格式:2016-09-21/日/年格式:16/10/21  
    HH:MM:SS PM格式(12时制):10:43:36 下午  
    HH:MM:SS格式(24时制):22:43:36  
    HH:MM格式(24时制):22:43 

     MessageFormat用法

    一、前言                              

      String.format 用得不习惯,希望格式模版会这样 {0}, this is {1}s cat.{1},this is {0}s dog. 后来发现 java.text.MessageFormat.format 可以满足我这个小小的愿望。

    二、静态方法

    String MessageFormat.format(String fmt, Object...args)

    入参fmt为MessageFormat模式参数。

    三、MessageFormat模式                      

      格式:  

     ArgumentIndex[,FormatType[,FormatStyle]] 

      ArgumentIndex ,是从0开始的入参位置索引。

      FormatType ,指定使用不同的Format子类对入参进行格式化处理。值范围如下:

         number:调用NumberFormat进行格式化

         date:调用DateFormat进行格式化

         time:调用DateFormat进行格式化

         choice:调用ChoiceFormat进行格式化

      FormatType ,设置FormatType中使用的格式化样式。值范围如下:

        short,medium,long,full,integer,currency,percent,SubformPattern(子格式模式,形如#.##)

      注意: FormatType 和 FormatStyle 主要用于对日期时间、数字、百分比等进行格式化。

      示例——将数字1.23格式为1.2:

    double num = 1.23;
    String str = MessageFormat.format("{0,number,#.#}", num);

    四、MessageFormat注意点                    

      1. 两个单引号才表示一个单引号,仅写一个单引号将被忽略。

      2. 单引号会使其后面的占位符均失效,导致直接输出占位符。

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

    因此可以用于输出左花括号(单写左花括号会报错,而单写右花括号将正常输出)

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

    因此前言中的示例应该写为

    {0}, this is {1}''s cat.{1},this is {0}''s dog.

     五、类层级关系

    |-- java.text.MessageFormat顶层抽象类java.text.Format—|                                   |--java.text.ChoiceFormat
    
                                  |--java.text.NumberFormat—|
    
                                         |--java.text.DecimalFormat
    
                                   |--java.text.DateFormat—java.text.SimpleDateFormat

      1. DecimalFormat

           用于格式化十进制实数。通过格式字符串来自定义格式化类型,舍入方式为half-even(四舍五入)。

           格式化模式: 

        正数子模式;负数子模式 ,如 0.00;-0.00 ,简写为 0.00 。

           模式中的占位符:

        0 ,代表该为位为数字,若不存在则用0填充

             # ,代表该为位为数字

        , ,代表分隔符, 如模式为 #,# ,那么格式化10时会返回1,0

     2. ChoiceFormat

        相当于以数字为键,字符串为值的键值对。分别使用一组double类型的数组作为键,一组String类型的数组作为值,两数组相同索引值的元素作为一对。

        示例——基本用法

    double[] limit = {0,1,3};
    String[] format = {"hello0", "hello1", "hello3"};
    ChoiceFormat cf = new ChoiceFormat(limit, format);
    for(int i = 0; i < 4; ++i){
      System.out.println(cf.format(i));
    }
    /* 输出
     * hello0
     * hello1
     * hello0
     * hello3
     */

    注意:当找不到对应的键值对时,则使用第一或最后一对键值对。

       示例——结合MessageFormat使用

    double[] limit = {0, 1};
    String[] format = {"Hello0", "Hello1{1}"};
    ChoiceFormat cf = new ChoiceFormat(limit, format);
    MessageFormat mf = new MessageFormat("{0}");
    mf.setFormatByArgumentIndex(0, cf);
    for (int i = 0; i < 2; ++i){
        System.out.println(mf.format(new Object[]{new Integer(i), new Integer(i+1)}));
    }
    /* 输出
     * Hello0
     * Hello12
     */

    实例:

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

    String pig = "{0}{1}{2}{3}{4}{5}{6}{7}{8}{9}{10}{11}{12}{13}{14}{15}{16}";  
      
    Object[] array = new Object[]{"A","B","C","D","E","F","G","H","I","J","K","L","M","N","O","P","Q"};  
      
    String value = MessageFormat.format(message, array);  
      
    System.out.println(value);

    最终结果是:ABCDEFGHIJKLMNOPQ

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

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

    最终结果是:oh, ZhangSan is a pig

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

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

    最终结果是:oh, ZhangSan is 'a' pig

    故乡明
  • 相关阅读:
    登录注册功能
    29-----BBS论坛
    linux笔记
    nginx,uwsgi发布web服务器
    linux常用服务部署
    linux系统基础优化及常用命令
    linux基本操作命令
    linux命令
    linux基础
    阿里云服务器搭建
  • 原文地址:https://www.cnblogs.com/luweiweicode/p/14254890.html
Copyright © 2011-2022 走看看