MFC筆記——CString Format()用法
在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格式用於列印字串,與之對應的引數應該是一個字元指標,待輸出的字元始於該指標所指向的地址,直到出現一個空字元('/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
0
1
2
3
問題:如果‘+’和‘ ’同時出現在“中間”時,要以‘+’為準。
兩個符號的共同點:用於對齊輸出的數:(尤其對於小數來說)
兩種格式:%+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”) 讀入的時候是會忽略掉空格,回車和製表符的。並且以空格,回車和製表符作為字串結束的標誌。
經常會有這樣的題,輸入第一行是一個整數,接下來每行的第一個是一個字元,用來表示某種操作,後面再跟一些資料,比如:
4
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);
將讀入的一整行字串按空格,製表符或回車符分割成兩個字串。
2
取指定長度的字串。如在下例中,取最大長度為4位元組的字串。
sscanf("123456 ", "%4s", str);
原文載自:http://blog.csdn.net/wangkaishou/article/details/5846152