關於在.net中字串格式化的方法string.format(),本人一直找不到一本合適的快速參考,故作此文。
自打本人學習.net framework起,心頭一直糾結一件事。我找不到類似於c語言中的sprintf()的函式,它有乙個輸出緩衝,乙個字串的格式描述和一串引數,並且跟據這一切建立一串你需要的字串。
例如:
char szerror[256];此句將生成一串「error 12 occurred.」 到szerror這個緩衝中(當然,前提是nerror為12)。這是c語言程式設計的基礎,甚至很多c++的程式設計師依然在使用這種方式,雖然在stl庫中提供了更好的功能,但sprintf相對更加清晰而易於使用。sprintf(szerror, "error %d occurred.\n", nerror);
stl中同樣的做法會是:
str << "error " << nerror << " occurred." << endl;或者其它類似的方式。它雖然是型別安全的,而且比sprintf更物件導向,但比較難於閱讀和本地化。
.net framework很好地處理了字串--但這需要適應,在.net中與sprintf最相近的就是靜態方法string.format(),它需要乙個格式字串和一些引數,然後生成乙個輸出的字串。(相對於sprintf最大的閃光點在於你再也不用擔心覆蓋了輸出緩衝。)
例如:
string errorstring = string.format("error occurred.", nerror);由於元資料機制的存在,.net環境不需要格式字串中指明要格式化的型別,你只要指明位置就行。(最常見的sprintf的bug就是提供了錯誤的資料型別,在你誤把%s當%d使用的時候,一但sprintf被呼叫,你的程式就會掛掉,沒有任何保護。)
在上面這個示例中,將會被nerror的值替換掉,但如果你想用指定的數值,或指定的進製(例如十六進製制),.net 都支援,但貌似這不是string.format的功能,而是型別自己的功能。
任何物件都有乙個叫tostring()的方法來返回物件的字串表述形式。tostring()方法可以接收乙個告訴物件怎麼來格式化自己的字串引數,而在string.format()中,這個格式字串是在佔位符後面傳遞,例如:""。
花括號中的格式是這樣的,。如果alignment是正數,文字在指定文字數的空間內右對齊;如果它是負數,則是左對齊。
字串
抱歉的是,對字串真的沒什麼可格式化的,只有對齊,而且對齊對所有呼叫string.format()中的內容都有效。
示例輸出
string.format("-><-", "hello");
-> hello<-
string.format("-><-", "hello");
->hello <-
數值
內建的數值格式化主要包括如下內容:
識別符型別
格式輸出(傳值 double 1.42)
輸出(傳值 int -12400)
ccurrency
$1.42
-$12,400
ddecimal
system.formatexception
-12400
escientific
1.420000e+000
-1.240000e+004
ffixed point
1.42
-12400.00
ggeneral
1.42
-12400
n帶千分號的number
1.42
-12,400
r四捨五入
1.42
system.formatexception
xhexadecimal
system.formatexception
cf90
自定義數值格式化包括如下內容:
識別符型別
格式輸出(傳值 double 1500.42)
注意0佔位符
1500.4200
用0填充位置.
數字佔位符
(1500).42
小數點佔位符
1500.4
千分號1,500
必須在兩個0中間
數值縮放
縮小1000倍(整除)
百分號150042%
乘上100再加個%
e指數佔位符
15e+2
允許多種指數格式
分組佔位符
見文末示例
分組佔位符在處理貨幣型資料的時候非常有用,它可以用不同的格式顯示負值或0,具體示例請看文末。
日期
請注意日期的格式化依賴於計算機的地區設定;示例為本人的地區設定下的結果
識別符型別
輸出(傳值 10/12/2002 10:11:29)
d短日期
10/12/2002
d長日期
december 10, 2002
t短時間
10:11 pm
t長時間
10:11:29 pm
f完整日期和時間
december 10, 2002 10:11 pm
f完整日期和時間(長)
december 10, 2002 10:11:29 pm
g預設日期和時間
10/12/2002 10:11 pm
g預設日期和時間(長)
10/12/2002 10:11:29 pm
m月和日
december 10
rrfc1123 日期時間
tue, 10 dec 2002 22:11:29 gmt
s可排序的日期時間
2002-12-10t22:11:29
u通用可排序本地日期時間
2002-12-10 22:11:29z
u通用可排序格林威治標準時間
december 10, 2002 10:11:29 pm
y年和月
december, 2002
u 識別符貌似有問題,輸出的字串沒有排序的意義。
自定義日期時間格式化(以2002-12-10 10:11:29.932 pm為示例):
識別符型別
示例輸出dd天
10ddd
周tue
dddd
完整周名
tuesday
f, ff, …
秒的小數部分
932gg, …
紀元a.d.
hh2位數小時
10hh
2位數小時,24小時格式
22mm分11
mm月12mmm
短月名dec
mmmm
長月名decemberss秒
29tt
上下午pm
yy年,2位數
02yyyy
年2002
zz時區
-05:00
zzz完整時區
-05:00
:分隔符
10:11:29
/分隔符
10/12/2002
列舉
識別符型別
g可以的話就顯示名稱,否則顯示數值
f顯示名稱
d顯示數值
x八位十六進製制
一些有用示例
string.format("", value);
當傳值1234.50的時候,輸出是$1,234.50,當傳值-1234.50的時候,輸出是¥1,234.50,當傳值0或-0的時候,輸出是「零蛋」 ,很顯然,這很像c#中的三元表示式。string.format(「」, 8005551212);
輸出是 「(800) 555-1212″。
C 字串格式化
c 字串格式化 1 格式化識別符號 標準的數學格式字串用於返回通常使用的字串。它們通常象x0這樣的格式。x是格式化識別符號,0是精度識別符號。格式識別符號號共有9種,它們代表了大多數常用的數字格式。就像下表所示 字母含義 c或ccurrency 貨幣格式 d或ddecimal 十進位制格式 十進位制...
C 格式化字串
在c 程式開發中,我們會經常需要獲得某種格式化的字串,比如 顏色值 ff00ff,貨幣 2.00,日期2012 03 14等等。在c 中格式化字串,一般會用到string.format 和.tostring 兩個函式。1.已知顏色的rgb值,獲取顏色的字串格式 ff00ff。ff0ff string...
C 格式化字串
格式字串的形式為 輸出最小寬度 精度 長度 型別 例如,d格式符表示 用十進位制整形格式輸出。f表示用實型格式輸出,5.2f 格式表示輸出寬度為5 包括小數點 幷包含2位小數。函式概要 printf 函式用於列印格式化字串到標準輸出流。函式原型 include.int printf const ch...