MFC中CString.Format的詳細用法

來源:互聯網
上載者:User

 

 在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);

 

 

 

 

 

 

Format是一個很常用,卻又似乎很煩的方法,以下是它的完整概貌,以供大家查詢之用:  

格式化字串forma("%d",12)意思是將一個整形的格式化的字元(我認為是保持其形狀不變) 
1).格式說明總是以%字元開始,以下是不同類型資料的格式方式%號後的說明: 
d輸出帶符號十進位數 
o輸出無符號八位元 
x輸出無符號十六進位數 
u輸出無符號數 
c輸出單個字元 
s輸出一串字元 
f輸出實數(6位小數) 
e以指數形式輸出實數 
g選用f與e格式中輸出寬度較小的格式,不輸出0 
ld輸入輸出long型資料 
lf輸入輸出double型資料 
m資料輸出寬度為m 
.n輸出小數位元為n 


一、字串 

首先看它的聲明:  
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格式用於列印字串,與之對應的參數應該是一個字元指標,待輸出的字元始於該指標所指向的地址,直到出現一個Null 字元('/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。 
精度 
  精度格式符以“.”開頭,後跟十進位整數。意義是:如果輸出數字,則表示小數的位元;如果輸出的是字元, 則表示輸出字元的個數;若實際位元大於所定義的精度數,則截去超過的部分。 
標誌格式字元

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.