1. 程式人生 > >MFC字串操作(二)CString.Format的用法

MFC字串操作(二)CString.Format的用法

在MFC程式中,使用CString來處理字串是一個很不錯的選擇。CString既可以處理Unicode標準的字串,也可以處理ANSI標準的字串(注:此處的Unicode標準和ANSI標準都是字元編碼的一種方式,後續會做總結)。CString的Format方法給我們進行字串的轉換帶來了很大的方便,比如常見的int、float和double這些數字型別轉換為CString字串只需一行程式碼就可以實現。 

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

%c                 單個字元

  %d                 十進位制整數(int)

  %ld                十進位制整數(long)

  %f                 十進位制浮點數(float)

  %lf                十進位制浮點數(double)

  %o                 八進位制數

  %s                 字串

  %u                 無符號十進位制數

%x                 十六進位制數

///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

int轉換為CString:

CString str;

int number=15;

str.Format(_T("%d"),number);

//結果str="15"

str.Format(_T("%4d"),number);

//結果 str=" 15"(前面有兩個空格;4表示將佔用4位,如果數字超過4位將輸出所有數字,不會截斷)

str.Format(_T("%.4d"),number);

//結果 str="0015"(.4表示將佔用4位,如果數字超過4位將輸出所有數字,不會截斷) 

long轉換為CString的方法與上面相似,只需要把%d改為%ld就可以了。

///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

double轉換為CString:

CString str;

double num=1.46;

str.Format(_T("%lf"),num);

//結果str="1.46"

str.Format(_T("%.1lf"),num);

//結果str="1.5"(.1表示小數點後留1位,小數點後超過1位則四捨五入)

str.Format(_T("%.4f"),num);

//結果str="1.4600"

str.Format(_T("%7.4f"),num);

//結果str=" 1.4600"(前面有1個空格)

float轉換為CString的方法也同上面相似,將lf%改為f%就可以了。

///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

十進位制數轉換為八進位制:

CString str;

int num=255;

str.Format(_T("%o"),num);

//結果 str="377"

str.Format(_T("%.8o"),num);

//結果str="00000377"

十進位制數轉換為十六進位制的方法也同上面相似,將o%改為x%就可以了。

///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

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

格式說明總是以%字元開始,以下是不同型別資料的格式方式%號後的說明:  d輸出帶符號十進位制數  o輸出無符號八進位制數  x輸出無符號十六進位制數  u輸出無符號數  c輸出單個字元  s輸出一串字元  f輸出實數(6位小數)  e以指數形式輸出實數  g選用f與e格式中輸出寬度較小的格式,不輸出0  ld輸入輸出long型資料  lf輸入輸出double型資料  m資料輸出寬度為m  .n輸出小數位數為n 

///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

字串

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,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]);

///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

sprintf:

與之對應的另一種格式化字串輸出方式是使用 sprintf: 

雖然說CString類有著許多的優點,但是並不能包辦所有的操作,最直接的一個問題就是

CString並不能直接賦值給一個字串變數,即CString類並沒有提供一種呼叫,可以將其內部的字串賦值給一個字串變數,如果要進行這種操作,則必須手動程式設計完成,但是某些函式中又必須要用到字串陣列型別,這個時候又面臨一個問題,即字串陣列該怎樣來格式化,這個時候需要呼叫sprintf函式,該函式是個全域性函式,其呼叫的格式如下:  

sprintf( buffer, " String: %s\n", s ); 

該函式中,buffer是需要被格式化的字串陣列,而“”中的內容就是格式化內容,最後的則是各種數字或這字串等,該函式很方便使用目前用到的格式化字串操作。

舉個使用sprintf格式化輸出字串的例子:

CString m_csFileName=PROGRAM_PATH+_T("\\audio");//strVoiceFilePath 

wchar_t s[30] = {0};

_stprintf(s,_T("%d%d%d%d%d%d"),sys2.wYear,sys2.wMonth,sys2.wDay,sys2.wHour,sys2.wMinute,sys2.wSecond/*,sys2.wMilliseconds*/);

m_csFileName.Append(s);

m_csFileName.Append(_T(".wav"));

注意:1.PROGRAM_PATH是一個CString型別,表示的是系統當前的絕對路徑

2.CString的成員函式Append 用到了字串的拼接

最後,用以上兩種思路都可以基本上解決,在使用注意UNICODE就行了,如果用到了UNICODE碼,注意用_T()來進行轉換