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;
        }
復制代碼

 

 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM