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()來進行轉換