String.format() 方法用法解說

?

前些天發現了一個巨牛的人工智能學習網站,通俗易懂,風趣幽默,忍不住分享一下給大家。點擊跳轉到教程。

String chargeFlowUrl = 
_AGENT_URL+
"?agentAccount="
+_AGENT_ACCOUNT
+"&sequence=%s &phone=%s &iceUrl=%s &range=%d &size=%d &_timestamp=%s";String url = String.format(chargeFlowUrl, sequence, 
phone , noticeUrl , range, size,
URLEncoder.encode(timestamp, "utf-8"));

在這里%S 像是一個通配符,把參數一個一個按順序填到對應位置。

JDK1.5開始String類中提供了一個非常有用的方法String.format(String format, Object ... args)

查看源碼得知其實是調用了java.util.Formatter.format(String, Object...)方法

public?static?String?format(String?format,?Object?...?args)?{??return?new?Formatter().format(format,?args).toString();??
}??

String.format(String format, Object ... args) 這個方法最重要的的地方就是它的第一個參數String format,我們只要掌握了這個參數的用法也就掌握了String.format的用法

首先來看一個列子

String?s2?=?String.format("%1$tY-%1$tm-%1$te",?new?Date());??
System.out.println(s2);??

這里會打印出什么內容?

先不急著去運行它,相信閱讀到后面不用運行,你也會知道的.

?

查看JDK文檔得知,String.format方法的第一個參數是有個公式可以套的

????%[argument_index$][flags][width][.precision]conversion

這里我們只要牢記這個公式就可以,下面說下每個顏色所代表的含義

argument_index: 可選,是一個十進制整數,用于表明參數在參數列表中的位置。第一個參數由 "1$" 引用,第二個參數由 "2$" 引用,依此類推。

flags:?可選,用來控制輸出格式

width:?可選,是一個正整數,表示輸出的最小長度

precision:可選,用來限定輸出字符數

conversion:必須,用來表示如何格式化參數的字符

?

先看一個簡單的列子:

System.out.println(String.format("我的名字叫%s",?"小明"));?//?打印:我的名字叫小明??

這里我們只用了%s這個簡單的表達式,對比上面的公式,我們發現[argument_index$][flags][width][.precision]這些部分全部都省略掉了

只留下一個必須的conversion,在這里conversion就是"s",百分號%是固定不變的

[argument_index$]省略之后它會自動把"小明"這個值填入到%s中去

我再稍微改下列子:

String.format("我叫%s,她叫%s",?"小明","小方");?//?我叫小明,她叫小方??


這里會按順序分別把小明,小方填入到對應的%s中. 如果我們要把小方填在前面,小明填在后面,那該怎么做呢,[argument_index$]就派上用場了

String.format("我叫%2$s,她叫%1$s",?"小明","小方");?//?我叫小方,她叫小明??

依然是百分號%開頭,中間多了個2$,1$

conversion可以填s,那還有什么其它字母可以填呢,當然有的比如

o:結果被格式化為八進制整數

x:結果被格式化為十六進制

d:結果被格式化為十進制整數

System.out.println(String.format("%o",?8));?//?10??
System.out.println(String.format("%x",?16));?//?10??

更多的conversion類別可以參考JDK文檔java.util.Formatter類


至此,我們已經了解了argument_index$和conversion的用處,接下來我們了解flagwidth的用法

flag是用來控制輸出格式的,比如左對齊,金額用逗號隔開等

width:表示最小寬度

先看個列子:

String.format("%1$,d",?12302562);?//?12,302,562??

這里多出一個逗號",",它就是flag,用于金額千分位隔開,當然寫成"%,d"也是可以的

再一個列子:

String.format("%1$08d",?123456);//?00123456??

這里0就是flag,表示結果將用零來填充,8就是width,表示最少要8位,d是conversion

至于其它的flag可以查閱JDK文檔

?

接下來說下[.precision]

這個單詞翻譯下是精度的意思,我們發現了前面有個小數點".",因此不難聯想到這個是關于浮點數類型的

只有當傳入的數據是浮點數時這個才有用,整數或者日期類型的數據都不能用

比如我想要四舍五入保留兩位小數,那么我可以這么寫:

String.format("%1$.2f",?12.12555);//?12.13??


這里f表示傳入的數字是浮點型,如果傳入的是整數,或者把f改成d都會拋出異常,JDK文檔中有明確說明

對于浮點轉換?'e'、'E'?和?'f',精度是小數點分隔符后的位數。如果轉換是?'g'?或?'G',那么精度是舍入計算后所得數值的所有位數。如果轉換是?'a'?或?'A',則不必指定精度。

對于字符、整數和日期/時間參數類型轉換,以及百分比和行分隔符轉換,精度是不適用的;如果提供精度,則會拋出異常。

到現在為止這套表達式公式已經基本講完了,這套公式是針對于基本數據類型,和字符串的,如果是正對于時間類型的數據該怎么做呢,比如格式化日期

其實文檔中已經給出說明了:

  • 用來表示日期和時間類型的格式說明符的語法如下:
       %[argument_index$][flags][width]conversion

    可選的?argument_indexflags?和?width?的定義同上。

    所需的?conversion?是一個由兩字符組成的序列。第一個字符是?'t'?或?'T'。第二個字符表明所使用的格式。這些字符類似于但不完全等同于那些由 GNU?date?和 POSIX?strftime(3c)?定義的字符。

    需要注意的是conversion?是一個由兩字符組成的序列。第一個字符是?'t'?或?'T'。

    也就是說用conversion的時候首先必要寫一個"t",然后在寫其它conversion

    時間類型有它自己的一套conversion,我們簡單的選擇幾個來說:

    'Y'年份,被格式化為必要時帶前導零的四位數(至少),例如,0092?等于格里高利歷的?92?CE。
    'm'月份,被格式化為必要時帶前導零的兩位數,即?01 - 13。
    'd'一個月中的天數,被格式化為必要時帶前導零兩位數,即?01 - 31

    上面三個分別表示年月日

    如果我要顯示年份,我就可以"%tY",顯示月份我就可以寫"%tm",記得一定要帶上"t"

    那么本篇一開始提到的那串復雜的表達式現在看來是不是很簡單呢:

    String?s2?=?String.format("%1$tY-%1$tm-%1$te",?new?Date());??
    System.out.println(s2);????

    String.format()方法差不多講完了,仔細看JDK文檔也會慢慢了解的

    需要批量進行格式化時,考慮下DateFormat,?MessageFormat,?NumberFormat?把他們封裝成一個靜態工具類或許更好

    畢竟調用String.format()方法是會new一個Formatter對象,雖然有GC幫忙,但是平時編程的時候還是要考慮這些因素的

    盡量少的創建對象,節省資源

    ?

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/452144.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/452144.shtml
英文地址,請注明出處:http://en.pswp.cn/news/452144.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

Choose unique values for the 'webAppRootKey' context-param in your web.xml files! 錯誤的解決

大意是Log4jConfigListener在獲取webapp.root值時&#xff0c;被后一context的值替換掉了&#xff0c;所以要在各個項目的web.xml中配置不同的webAppRootKey值&#xff0c;隨即在其中一個web.xml中添加&#xff1a; <context-param> <param-name>webAppRootKey<…

ionic3 cordova ionic-native插件

ionic-native插件 cordova安裝插件 以及 ionic-native插件使用過程以及步驟 cordova plugin add cordova-plugin-插件名稱。 //安裝插件npm install ionic-native/對應插件名稱 --save。 //寫入package.json在app.module.ts 的 providers 進行引用解釋&#xff1a;cordove plug…

Diango博客--19.使用 Docker部署項目到線上服務器

文章目錄1.克隆代碼到服務器2.創建環境變量文件用于存放項目敏感信息3.在 .production 文件寫入下面的內容并保存4.修改 Nginx 配置5.修改項目配置文件6.啟動容器7.檢查容器啟動狀況8.配置 HTTPS 證書&#xff08;沒有配置域名無法配置&#xff0c;只能通過服務器 ip 以 HTTP 協…

從一生的角度看程序員的學習和發展

很多人談學習和發展的時候&#xff0c;往往忽略人的先天自然條件&#xff0c;在這里我們從這個視角切入&#xff0c;來探討一下程序員一生的可能軌跡。 如果把程序員的人生分為三個階段&#xff0c;那么他們是&#xff1a; 畢業~30歲&#xff1a;這個時間段里&#xff0c;大多…

Jquery Datatable 數據填充報錯:requested unknown parameter ‘XXX‘ for row xx, column xx 解決方法

前些天發現了一個巨牛的人工智能學習網站&#xff0c;通俗易懂&#xff0c;風趣幽默&#xff0c;忍不住分享一下給大家。點擊跳轉到教程。 報錯如圖&#xff1a; 解決方法見官網&#xff1a;https://datatables.net/manual/tech-notes/4 摘要如下&#xff1a; Parameter is an…

Tarjan-縮點

$Tarjan$縮點 Tarjan的第二個應用就是求縮點啦。縮點雖然比割點麻煩一點&#xff0c;但是用處也比割點要大不少。 本來要學另外兩個縮點算法的,但是似乎沒什么用...$MST$里確實有只能有$prim$或者只能用$kruscal$的題目&#xff0c;但是這三種縮點...在網上沒有找到介紹它們之間…

mysqldump參數詳細說明(轉)

Mysqldump參數大全&#xff08;參數來源于mysql5.5.19源碼&#xff09; 參數 參數說明 --all-databases , -A 導出全部數據庫。 mysqldump -uroot -p --all-databases --all-tablespaces , -Y 導出全部表空間。 mysqldump -uroot -p --all-databases --all-tablespaces --n…

Diango博客--20.開啟 Django 博客的 RSS 功能

1.Rss簡介 博客提供 RSS 訂閱應該是標配&#xff0c;這樣讀者就可以通過一些聚合閱讀工具訂閱你的博客&#xff0c;時時查看是否有文章更新&#xff0c;而不必每次都跳轉到博客上來查看。現在我們就來為博客添加 RSS 訂閱功能。 RSS&#xff08;Really Simple Syndication&am…

什么是P2P

P2P技術又稱為點對點傳輸技術。舉個簡單的例子&#xff0c;以便可以更好的理解。比如&#xff0c;以前我們要下載一個文件&#xff0c;我們一定要從服務器下載。有了P2P技術之后&#xff0c;我們可以向其它下載過這個文件的電腦獲取這個文件&#xff0c;我下載完成了這個文件之…

SQL語句使用大全,最常用的sql語句

下列語句部分是Mssql語句&#xff0c;不可以在access中使用. SQL分類&#xff1a; DDL—數據定義語言(Create&#xff0c;Alter&#xff0c;Drop&#xff0c;DECLARE) DML—數據操縱語言(Select&#xff0c;Delete&#xff0c;Update&#xff0c;Insert) DCL—數據控制語言(…

Oracle 的 SQL語句中 decode()函數

decode()函數簡介&#xff1a; 主要作用&#xff1a;將查詢結果翻譯成其他值&#xff08;即以其他形式表現出來&#xff0c;以下舉例說明&#xff09;&#xff1b; 使用方法&#xff1a; Select decode&#xff08;columnname&#xff0c;值1,翻譯值1,值2,翻譯值2,...值n,翻譯值…

百度王一男: DevOps 的前提是拆掉業務-開發-測試-運維中間的三面墻

這是一個創建于 375 天前的主題&#xff0c;其中的信息可能已經有所發展或是發生改變。由數人云、優維科技、中生代社區聯合發起的 系列 Meetup 《 DevOps&SRE 超越傳統運維之道》 先后在深圳、北京舉行過兩場 7 月 15 日上海站&#xff0c;敬請期待 ▼ 王一男老師在《 Dev…

linux上mongodb的安裝與卸載

安裝 1.下載安裝包 wget http://fastdl.mongodb.org/linux/mongodb-linux-i686-1.8.2.tgz 下載完成后解壓縮壓縮包 tar zxf mongodb-linux-i686-1.8.2.tgz 2. 安裝準備 將mongodb移動到/usr/local/server/mongdb文件夾 mv mongodb-linux-i686-1.8.2 /usr/local/mongodb 創建數據…

面向對象設計的準則

1.模塊化 對象就是模塊 把數據結構和操作這些數據的方法緊密地結合在一起 2.抽象 過程抽象 數據抽象&#xff1a;類 參數化抽象&#xff1a;C的“模板” 3.信息隱藏 通過對象的封裝性實現類&#xff0c;分離了接口與實現&#xff0c;支持信息隱藏 4.弱耦合 某一部分的…

Linux觸發連鎖反應,惠及全球

所謂“連鎖反應”是指&#xff0c;若干個相關的事物&#xff0c;只要一個發生變化&#xff0c;其他都跟著發生變化。在軟件界的“圈子”里面&#xff0c;一般而言&#xff0c;“連鎖反應”這個詞匯是不經常使用的。 4月21日&#xff0c;芬蘭科學院把2012年最高技術成就獎授予Li…

Diango博客--21.實現簡單的全文搜索

文章目錄1. 概述2. 模板&#xff1a;將關鍵詞提交給服務器3. 視圖&#xff1a;查找含有搜索關鍵詞的文章4. 視圖&#xff1a;綁定 URL1. 概述 搜索是一個復雜的功能&#xff0c;但對于一些簡單的搜索任務&#xff0c;我們可以使用 Django Model 層提供的一些內置方法來完成&am…

解決Cannot change version of project facet Dynamic web module to 2.5

見 &#xff1a; http://blog.csdn.net/steveguoshao/article/details/38414145 我們用Eclipse創建Maven結構的web項目的時候選擇了Artifact Id為maven-artchetype-webapp&#xff0c;由于這個catalog比較老&#xff0c;用的servlet還是2.3的&#xff0c;而一般現在至少都是2.5…

shell編程 之 test命令

shell編程里的測試test命令基本可以分為3種數據類型&#xff0c;每種都不一樣。個人更傾向于理解為條件語句的寫法規則,就是test加條件加判斷語句。 1 數值類型 基本可以分為6個判斷&#xff1a;-eq等于&#xff0c;-ne不等于&#xff0c;-gt大于&#xff0c;-lt小于&#xff0…

HTTP 協議知識點總結(一)

在許多大公司的面試中&#xff0c;經常會重點考察面試者的計算機基礎知識。所以對于在計算機網絡、數據結構、操作系統上花費更多的時間和精力&#xff0c;是完全值得的。HTTP 作為應用最為廣泛的網絡協議&#xff0c;不論前端和后端都需要經常接觸。最近決定對 HTTP 進行了一些…