C 字串格式化大全

2022-03-24 11:03:24 字數 4018 閱讀 7109

關於在.net中字串格式化的方法string.format(),本人一直找不到一本合適的快速參考,故作此文。

自打本人學習.net framework起,心頭一直糾結一件事。我找不到類似於c語言中的sprintf()的函式,它有乙個輸出緩衝,乙個字串的格式描述和一串引數,並且跟據這一切建立一串你需要的字串。

例如:

char szerror[256];

sprintf(szerror, "error %d occurred.\n", nerror);

此句將生成一串「error 12 occurred.」 到szerror這個緩衝中(當然,前提是nerror為12)。這是c語言程式設計的基礎,甚至很多c++的程式設計師依然在使用這種方式,雖然在stl庫中提供了更好的功能,但sprintf相對更加清晰而易於使用。

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...