CString Format的用法(轉)

在MFC中會經常用到CString::Format。下面是我收集的一些資料。

官方定義:

————————————————————————————

CString::Format

void Format( LPCTSTR lpszFormat, ... );

void Format( UINT nFormatID, ... );

Parameters

lpszFormat           A format-control string.

nFormatID           The string resource identifier that contains the format-control string.

Remarks

Call this member function to write formatted data to a CString in the same way that sprintf formats data into a C-style character array. This function formats and stores a series of characters and values in the CString. Each optional argument (if any) is converted and output according to the corresponding format specification inlpszFormat or from the string resource identified by nFormatID.

The call will fail if the string object itself is offered as a parameter to Format. For example, the following code:

CString str = "Some Data";
str.Format("%s%d", str, 123);   // Attention: str is also used in the parameter list.

will cause unpredictable results.

When you pass a character string as an optional argument, you must cast it explicitly as LPCTSTR. The format has the same form and function as the format argument for the printf function. (For a description of the format and arguments, see http://msdn.microsoft.com/zh-cn/library/ms396940(v=vs.60).aspx in the Run-Time Library Reference.) A null character is appended to the end of the characters written.

Example

CString str;

str.Format(_T("Floating point: %.2f\n"), 12345.12345);
_tprintf("%s", (LPCTSTR) str);

str.Format(_T("Left-justified integer: %.6d\n"), 35);
_tprintf("%s", (LPCTSTR) str);

str.Format(IDS_SCORE, 5, 3);
_tprintf("%s", (LPCTSTR) str);
  

Output

If the application has a string resource with the identifier IDS_SCORE that contains the string "Penguins: %d\nFlyers  : %d\n", the above code fragment produces this output:

Floating point: 12345.12
Left-justified integer: 000035
Penguins: 5
Flyers  : 3

更多資源:

MFC中CString.Format的詳細用法

http://blog.csdn.net/wangkaishou/article/details/5846152

在MFC程序中,使用CString來處理字符串是一個很不錯的選擇。CString既可以處理Unicode標準的字符串,也可以處理ANSI標準的字符串。CString的Format方法給我們進行字符串的轉換帶來了很大的方便,比如常見的int、float和double這些數字類型轉換爲CString字符串只需一行代碼就可以實現。

  先看看Format用於轉換的格式字符:

  %c                 單個字符

  %d                 十進制整數(int)

  %ld                十進制整數(long)

  %f                 十進制浮點數(float)

  %lf                十進制浮點數(double)

  %o                 八進制數

  %s                 字符串

  %u                 無符號十進制數

  %x                 十六進制數

1、int轉換爲CString:

CString str;
int number=15;
//str="15"
str.Format(_T("%d"),number);
//str=" 15"(前面有兩個空格;4表示將佔用4位,如果數字超過4位將輸出所有數字,不會截斷)
str.Format(_T("%4d"),number);
//str="0015"(.4表示將佔用4位,如果數字超過4位將輸出所有數字,不會截斷)
str.Format(_T("%.4d"),number);
long轉換爲CString的方法與上面相似,只需要把%d改爲%ld就可以了。

2、double轉換爲CString:

  CString str;
  double num=1.46;
  //str="1.46"
  str.Format(_T("%lf"),num);
  //str="1.5"(.1表示小數點後留1位,小數點後超過1位則四捨五入)
  str.Format(_T("%.1lf"),num);
  //str="1.4600"
  str.Format(_T("%.4f"),num);
  //str=" 1.4600"(前面有1個空格)
  str.Format(_T("%7.4f"),num);
  float轉換爲CString的方法也同上面相似,將lf%改爲f%就可以了。

3、將十進制數轉換爲八進制:

CString str;
int num=255;
//str="377"
str.Format(_T("%o"),num);
//str="00000377"
str.Format(_T("%.8o"),num);


一、字符串 
首先看它的聲明:  
function Format(const Format: string; const Args: array of const): string; overload;  
事實上Format方法有兩個種形式,另外一種是三個參數的,主要區別在於它是線程安全的,  
但並不多用,所以這裏只對第一個介紹:  

function Format(const Format: string; const Args: array of const): string; overload;  
Format參數是一個格式字符串,用於格式化Args裏面的值的。Args又是什麼呢,  
它是一個變體數組,即它裏面可以有多個參數,而且每個參數可以不同。  
如以下例子:  
Format("my name is %6s","wind");  
返回後就是  
my name is wind  

現在來看Format參數的詳細情況:  
Format裏面可以寫普通的字符串,比如"my name is"  
但有些格式指令字符具有特殊意義,比如"%6s"  

格式指令具有以下的形式:  
"%" [index ":"] ["-"] [width] ["." prec] type  
它是以"%"開始,而以type結束,type表示一個具體的類型。中間是用來  
格式化type類型的指令字符,是可選的。  

先來看看type,type可以是以下字符:  
d 十制數,表示一個整型值  
u 和d一樣是整型值,但它是無符號的,而如果它對應的值是負的,則返回時  
是一個2的32次方減去這個絕對值的數  
如:Format("this is %u",-2);  
返回的是:this is 4294967294  
f 對應浮點數  
e 科學表示法,對應整型數和浮點數,  
比如Format("this is %e",-2.22);  
返回的是:this is -2.220000E+000  
等一下再說明如果將數的精度縮小  
g 這個只能對應浮點型,且它會將值中多餘的數去掉  
比如Format("this is %g",02.200);  
返回的是:this is 2.2  
n 只能對應浮點型,將值轉化爲號碼的形式。看一個例子就明白了  
Format("this is %n",4552.2176);  
返回的是this is 4,552.22  
注意有兩點,一是隻表示到小數後兩位,等一下說怎麼消除這種情況  
二是,即使小數沒有被截斷,它也不會也像整數部分一樣有逗號來分開的  
m 錢幣類型,但關於貨幣類型有更好的格式化方法,這裏只是簡單的格式化  
另外它只對應於浮點值  
Format("this is %m",9552.21);  
返回:this is ¥9,552.21  
p 對應於指針類型,返回的值是指針的地址,以十六進制的形式來表示  
例如:  
Format("this is %p",p);  
Edit1的內容是:this is 0012F548  
s 對應字符串類型,不用多說了吧  
x 必須是一個整形值,以十六進制的形式返回  
Format("this is %X",15);  
返回是:this is F  

類型講述完畢,下面介紹格式化Type的指令:  
[index ":"] 這個要怎麼表達呢,看一個例子  
Format("this is %d %d",12,13);  
其中第一個%d的索引是0,第二個%d是1,所以字符顯示的時候  
是這樣 this is 12 13  

而如果你這樣定義:  
Format("this is %1:d %0:d",12,13);  
那麼返回的字符串就變成了  
this is 13 12  
現在明白了嗎,[index ":"] 中的index指示Args中參數顯示的  
順序  

還有一種情況,如果這樣Format("%d %d %d %0:d %d", 1, 2, 3, 4) ; 
將返回1 2 3 1 2。  
如果你想返回的是1 2 3 1 4,必須這樣定:  
Format("%d %d %d %0:d %3:d", 1, 2, 3, 4) ; 
但用的時候要注意,索引不能超出Args中的個數,不然會引起異常  
如Format("this is %2:d %0:d",12,13);  //error
由於Args中只有12 13 兩個數,所以Index只能是0或1,這裏爲2就錯了  
[width] 指定將被格式化的值佔的寬度,看一個例子就明白了  
Format("this is %4d",12);  
輸出是:this is 12  
這個是比較容易,不過如果Width的值小於參數的長度,則沒有效果。  
如:Format("this is %1d",12);  
輸出是:this is 12  
["-"] 這個指定參數向左齊,和[width]合在一起最可以看到效果:  
Format("this is %-4d,yes",12);  
輸出是:this is 12 ,yes  

["." prec] 指定精度,對於浮點數效果最佳:  
Format('this is %.2f',['1.1234]);  
輸出 this is 1.12  
Format('this is %.7f',['1.1234]);  
輸了 this is 1.1234000  

而對於整型數,如果prec比如整型的位數小,則沒有效果  
反之比整形值的位數大,則會在整型值的前面以0補之  
Format('this is %.7d',[1234]);  
輸出是:this is 0001234]  

對於字符型,剛好和整型值相反,如果prec比字符串型的長度大  
則沒有效果,反之比字符串型的長度小,則會截斷尾部的字符  
Format('this is %.2s',['1234']);  
輸出是 this is 12  

而上面說的這個例子:  
Format('this is %e',[-2.22]);  
返回的是:this is -2.22000000000000E+000  
怎麼去掉多餘的0呢,這個就行啦  
Format('this is %.2e',[-2.22]);  

好了,第一個總算講完了,應該對他的應用很熟悉了吧  

m_result.Format("您選的城市是:/r/n %s,/r/n您選的人是:/r/n%s",city1 +  city2 +  city3,people); 
  UpdateData(0);

格式小結: 
(1)最常用的格式是%d,含義是以10進制形式打印一個整數。 
如果輸出的整數是負數,則,輸出的第一個字符就是‘-’號 
(2)%u格式與%d格式類似,只不過要求打印無符號10進制整數。 
(3)%o格式請求輸出8進制整數 
(4)%x和%X格式請求輸出16進制整數。 
%x格式中用小寫字母a,b,c,d,e,f來表示10到15之間的數 
%X格式中用大寫字母A,B,C,D,E,F來表示10到15之間的數 
共同點:8進制和16進制整數總是作爲無符號數處理的。 
(5)%s格式用於打印字符串,與之對應的參數應該是一個字符指針,待輸出的字符始於該指針所指向的地址,直到出現一個空字符('/0') 
才終止。 
(6)%c格式用於打印單個字符:例如: 
printf("%c",c); 等價於 putchar©; 
(7)%g,%f和%e這三個格式用於打印浮點值。 
%g格式用於打印那些不需要按列對齊的浮點數特別有用。其作用有二: 
一,去掉該數尾多餘的零(沒有達到六位的數) 
二,保留六位有效數字(多餘六位的) 
%e格式用於打印浮點數時,一律顯示地使用指數形式:例如:輸出圓周率時是:3.141593e+00 
兩者的區別: 
%g格式打印出的數是總共6位有效數字 
%e格式打印出小數點後的6位有效數字 
%f禁止使用指數形式來表示浮點數。因此圓周率輸出爲:3.141593 
(但注意它的精度要求:也是小數點後6位有效數字) 
(8)%%格式用於打印一個%字符。 
(9)%E和%G只是在輸出時用大寫字母(E)代替了小寫字母(e) 
另外需要注意的一些知識點: 

*************************************** 
對齊規則: 
(1)當指定寬度大於要輸出位數時,數右對齊,左端補空格 
當前綴'-'號時,想要數左對齊,右端補空格 
大大的前提:只有當“指定寬度”存在時,前綴'-'纔有意義。 
經驗:一般來說,左端對齊的形式看上去要美觀整齊一點。 
*************************************** 
輸出正負號的技巧:(記住)例如: 
printf("%+d %+d %+d/n",-5,0,5); 
只要在中間加個“+”號就行。作用是輸出符號位(即,數的正負號) 
如果不希望正數的前面出現‘+’號,可用下面的方法 

*************************************** 
只要在中間加個“ ”號(即:空格)就行。(記住)例如: 
作用:如果一個數是非負數,就在它的前面插入一個空格。 
int i; 
for(i=-3;i<=3;i++) 
 printf("% d/n",i); //注意%和d之間有一個空格 
輸出結果如下: 
-3 
-2 
-1 




問題:如果‘+’和‘ ’同時出現在“中間”時,要以‘+’爲準。 
兩個符號的共同點:用於對齊輸出的數:(尤其對於小數來說) 
 兩種格式:%+e和% e 
C語言中基本的輸入輸出函數有: 
putchar ():把變量中的一個字符常量輸出到顯示器屏幕上; 
getchar ();從鍵盤上輸入一個字符常量,此常量就是該函數的值; 
printf ();把鍵盤中的各類數據,加以格式控制輸出到顯示器屏幕上; 
scanf ();從鍵盤上輸入各類數據,並存放到程序變量中; 
puts ():把數組變量中的一個字符串常量輸出到顯示器屏幕上; 
gets ():從鍵盤上輸入一個字符串常量並放到程序的數組中. 
sscanf(); 從一個字符串中提取各類數據。 
 putchar() 和 getchar() 顧名思議就是從輸入流中獲取一個字符和輸出一個字符,比較簡單,不再多講。 
例子如下: 
char c = getchar(); 
putchar©; 
 格式化輸入輸出scanf()和printf()是最有用的,所以重點講一下。 
printf(): 
一般形式: 
printf("格式控制".輸出列表);  
eg : printf("a=%d,b=%f,c=%c/n",a,b,c); 
1;格式控制. 
格式控制是用雙引號括起來的字符串,也稱"轉換控制字符串",它包含以下兩部分信息. 
格式說明:由"%"和格式字符組成,如%d,%f,%c,他的作用是把輸出數據轉換爲指定格式輸出,格式的說明總是由"%"字符開始的.

普通字符:需要原樣輸出的字符,或者是一些有特殊含義的字符,如/n,/t。 
2;輸出列表 
就是需要輸出的一些數據,也可以是表達式,如果在函數中需要輸出多個變量或表達式,則要用逗號隔開. 
 一些特殊字符的輸出: 
單引號,雙引號,和反斜槓的輸出在前面加轉義字符”/” 
如:”/’” , “/”” , “//” 
%的輸出用兩個連在一起的%%,即printf(“%%”); 

常用的格式說明如下: 
格式字符 
d 以十進制形式輸出帶符號整數(正數不輸出符號)  
o 以八進制形式輸出無符號整數(不輸出前綴O)  
x 以十六進制形式輸出無符號整數(不輸出前綴OX)  
u 以十進制形式輸出無符號整數  
f 以小數形式輸出單精度實數  
lf以小數形式輸出雙精度實數 
e 以指數形式輸出單、雙精度實數  
g 以%f%e中較短的輸出寬度輸出單、雙精度實數  
c 輸出單個字符  
s 輸出字符串  
 這裏強調一下:網上很多文章都說f 和lf是一樣的,即不管單精度,雙精度浮點數,都可以用f, 但我在POJ上做過測試,輸出Double時用f確實也可以 ,但讀入時,用f就報WA,所以大家如果對Double進行讀寫的話,都用lf吧。 
說到Double,再囉嗦一句,建議大家要用到浮點數時都用Double,不要用float,因爲在很多情況下,float精度不夠會導致WA。 
特殊: 
對64位整數的輸入輸出,在POJ上的C++環境下(即VC),64位整數是: 
__int64 (注意int前面是兩個下劃線) 
輸入輸出格式爲”%I64d”. 
在G++環境下(即Dev C++) 64位整數是 
long long 
輸入輸出格式爲”%lld”. 

輸出寬度 
  用十進制整數來表示輸出的最少位數。 注意若實際位數多於定義的寬度,則按實際位數輸出, 若實際位數少於定義的寬度則補以空格或0。 
精度 
  精度格式符以“.”開頭,後跟十進制整數。意義是:如果輸出數字,則表示小數的位數;如果輸出的是字符, 則表示輸出字符的個數;若實際位數大於所定義的精度數,則截去超過的部分。 
標誌格式字符  
- 結果左對齊,右邊填空格  
+ 輸出符號(正號或負號)空格輸出值爲正時冠以空格,爲負時冠以負號 
例如: 
double c=24212345.24232; 
printf(“%020.4”); 表示輸出精確到小數點後4位,輸出佔20位,若有空餘的位補0. 
 scanf: 
scanf的很多用法都是和printf對應的,故不再贅述。 
說一下scanf一個特別好用的地方,就是可以濾去一些不想要的東西。 
舉例說明如下: 
比如輸入爲日期 yyyy-mm-dd,就可以這樣寫: 
int year,moth,day; 
scanf(“%d-%d-%d”,&year,&moth,&day); 
再比如: 
scanf("%3d %*3d %2d",&m,&n); 輸入113 118 69回車(系統將113賦予m,將69賦予n,因爲*號表示跳過它相應的數據所以118不賦予任何變量) 
puts()用的不多,且基本都能用printf()代替,故不再多說。 
gets()是從輸入流中獲取一行字符串放入字符數組中: 
char in[100]; 
gets(in); 
大家可能最容易出錯的地方就是字符串的輸入,所以強調一下: 
能進行字符,字符串輸入的有: 
getchar(), scanf(“%c”); scanf(“%s”), gets() 
其中getchar() 和 scanf(“%c”)的功能是一樣的。 
需要注意的是,這兩個函數讀入的是輸入流中當前位置的字符, 
比如: 
 scanf(“%d”,&n); 
 c = getchar(); 
假設輸入 67/ (假設“/”代表回車),則第一個scanf讀入一個整數67後,當前輸入流的位置是67之後,即指向回車符,所以第二個getchar()讀入的就是一個回車符了,即 c = ‘/n’。 
同樣,gets()也是從當前位置讀入一行字符串。 
比如: 
scanf(“%d”,&n); 
gets(str); 
此時讀入字符數組中的字符串就是“/n” 了 
所以通常在用scanf讀入一個非字符串的類型之後,如果要讀入字符,或字符數組,都用一個額外的getchar()把回車符讀掉,若後面跟的不止一個回車符,可能還有多餘的空格的話,就用gets()讀掉。 
 和以上不同的是,scanf(“%s”) 讀入的時候是會忽略掉空格,回車和製表符的。並且以空格,回車和製表符作爲字符串結束的標誌。 
 經常會有這樣的題,輸入第一行是一個整數,接下來每行的第一個是一個字符,用來表示某種操作,後面再跟一些數據,比如: 

A 100 2 
B 23 
A 23 89 
B 34 
像這種輸入就需要小心,讀入字符時不要讀成回車符。 
爲了防止意外,我一般是這樣處理這類輸入的: 
char model[2]; 
Scanf(“%d”,&n); 
for(…,…,…){ 
 scanf(“%s”,model); 
 if(model[0] == ‘A’){ 

else{ 


 sscanf(): 
sscanf()經常用來分解字符串,功能非常強大,但很多功能都需要正則表達式的知識,所以就介紹一下最簡單的幾種用法,大家如果想了解更多的話,自己去網上找吧。 
1. 
char str[100],str1[100],str2[100]; 
gets(str); 
sscanf(str,”%s%s”,str1,str2); 
將讀入的一整行字符串按空格,製表符或回車符分割成兩個字符串。 

取指定長度的字符串。如在下例中,取最大長度爲4字節的字符串。 
  sscanf("123456 ", "%4s", str);



發佈了138 篇原創文章 · 獲贊 187 · 訪問量 71萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章