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

    java中:

    从 Java 5.0 开始,String 类新增了一个强大的字符串格式化方法 format()。这个方法到现在用的人还是不多,实在是一种浪费。本文带你快速过一遍这个方法的功能,将来你要用到格式化文本的时候,可能就不需要再借用第三方类库或自己去实现了。

    首先看一个简单例子:

    String formatted = String.format("%s今年%d岁。", "小李", 30); // "小李今年30岁。"

    不用我多解释,你也可以看出:

    1. 这个方法第一个参数是格式串,后面的参数都是格式串的参数,用于替换格式串中的占位符。
    2. 占位符以 "%x" 的形式表示,不同的参数类型要用不同的字母。后面会具体介绍。
    3. String.format() 返回值类型为字符串,也就是格式化的结果。

    一、占位符类型

    占位符 "%" 后面的字母决定了其接受的实际参数的类型。占位符类型有下面几种:

    字母适用参数类型说明
    %a 浮点数 以16进制输出浮点数
    %b / %B 任意值 如果参数为 null 则输出 false,否则输出 true
    %c / %C 字符或整数 输出对应的 Unicode 字符
    %d 整数 对整数进行格式化输出
    %e / %E 浮点数 以科学记数法输出浮点数
    %f 浮点数 对浮点数进行格式化输出
    %g / %G 浮点数 以条件来决定是否以科学记数法方式输出浮点数
    %h / %H 任意值 以 16 进制输出参数的 hashCode() 返回值
    %o 整数 以8进制输出整数
    %s / %S 字符串 对字符串进行格式化输出
    %t 日期时间 对日期时间进行格式化输出
    %x / %X 整数 以16进制输出整数
    %n 换行符
    %% 百分号本身

    大写字母表示输出的字母都为大写。

    我们平常用的最多的就是 %s%d 和 %f,偶尔会用到 %t。本文篇幅有限,仅介绍这四种,剩下的请自行阅读 API 文档

    二、字符串和整数格式化

    这里直接给出例子来说明:

    // 补齐空格并右对齐:
    String.format("%10s, world", "Hello");     // 输出 "     Hello, world"
    String.format("%8d", 123);                 // 输出 "     123"
    
    // 补齐空格并左对齐:
    String.format("%-10s, world", "Hello");    // 输出 "Hello     , world"
    String.format("%-8d", 123);                // 输出 "123     "
    
    // 补齐 0 并对齐(仅对数字有效)
    String.format("%08d", 123);                // 输出 "00000123"
    String.format("%-08d", 123);               // 错误!不允许在右边补齐 0
    
    // 输出最多N个字符
    String.format("%.5s", "Hello, world");       // 输出 "Hello"
    String.format("%.5s...", "Hello, world");    // 输出 "Hello..."
    String.format("%10.5s...", "Hello, world");  // 输出 "     Hello..."
    
    // 输出逗号分隔数字
    String.format("%,d", 1234567);               // 输出 "1,234,567"
    

    三、日期格式化

    这个就稍微复杂点,但如果你要在字符串中对文本数字和日期进行混排的话,只调一个方法应该比结合 DateFormat 和 NumberFormat 一起用要方便点。

    首先补充一个知识,就是占位符可以指定某个位置的参数,格式为 %n$。例如 %2$d 表示第二个整形参数。注意这里的 n是 1 开始而不是 0 开始。

    格式化日期的时候,需要多个占位符指向同一个参数(以避免同一个参数重复几遍),同时因为 "t" 表示日期时间,所以完整的格式为 %n$tX,其中 X 表示取时间中的哪一部分。X 的可选值例如:

    Y=年;m=月;d=日;H=时;M=分;S=秒;L=毫秒;A=星期几(名称);B=月份名称;

    还有其他的字母,具体请参考 API 文档。下面是一个例子:

     
    // 输出格式为 “Now is         15:04:52, 星期日”
    // 注意 "%1$10tH" 中的 10 同样表示空格补齐 10 位并右对齐
    String.format("Now is %1$10tH:%1$tM:%1$tS, %1$tA", new Date())

    js中:

    //两种调用方式
     var template1="我是{0},今年{1}了";
     var template2="我是{name},今年{age}了";
     var result1=template1.format("loogn",22);
     var result2=template2.format({name:"loogn",age:22});

     //两个结果都是"我是loogn,今年22了"

    --------------------------------------------------------------------------

    var a = "I Love {0}, and You Love {1},Where are {0}! {4}";
    alert(String.format(a, "You","Me"));

    alert(a.format("You","Me"));

    String.prototype.format = function(args) {
                var result = this;
                if (arguments.length > 0) {
                    if (arguments.length == 1 && typeof (args) == "object") {
                        for (var key in args) {
                            if (args[key] != undefined) {
                                var reg = new RegExp("({" + key + "})", "g");
                                result = result.replace(reg, args[key]);
                            }
                        }
                    }
                    else {
                        for (var i = 0; i < arguments.length; i++) {
                            if (arguments[i] != undefined) {
                                //var reg = new RegExp("({[" + i + "]})", "g");//这个在索引大于9时会有问题,谢谢何以笙箫的指出
                                var reg = new RegExp("({)" + i + "(})", "g");
                                result = result.replace(reg, arguments[i]);
                            }
                        }
                    }
                }
                return result;
            }
            String.format = function () {
                if (arguments.length == 0)
                    return null;
    
                var str = arguments[0];
                for (var i = 1; i < arguments.length; i++) {
                    var re = new RegExp('\{' + (i - 1) + '\}', 'gm');
                    str = str.replace(re, arguments[i]);
                }
                return str;
            }
    复制代码
     
  • 相关阅读:
    【校招面试 之 C/C++】第23题 C++ STL(五)之Set
    Cannot create an instance of OLE DB provider “OraOLEDB.Oracle” for linked server "xxxxxxx".
    Redhat Linux安装JDK 1.7
    ORA-10635: Invalid segment or tablespace type
    Symantec Backup Exec 2012 Agent for Linux 卸载
    Symantec Backup Exec 2012 Agent For Linux安装
    You must use the Role Management Tool to install or configure Microsoft .NET Framework 3.5 SP1
    YourSQLDba介绍
    PL/SQL重新编译包无反应
    MS SQL 监控数据/日志文件增长
  • 原文地址:https://www.cnblogs.com/mark5/p/11430245.html
Copyright © 2011-2022 走看看