CString 型轉化成 int 型 把 CString 類型的數據轉化成整數類型最簡單的方法就是使用標準的字符串到整數轉換例程。
雖然通常你懷疑使用_atoi()函數是一個好的選擇,它也很少會是一個正確的選擇。如果你準備使用 Unicode 字符,你應該用_ttoi(),它在 ANSI 編碼系統中被編譯成_atoi(),而在 Unicode 編碼系統中編譯成_wtoi()。你也可以考慮使用_tcstoul()或者_tcstol(),它們都能把字符串轉化成任意進制的長整數(如二進制、八進制、十進制或十六進制),不同點在於前者轉化後的數據是無符號的(unsigned),而後者相反。看下面的例子:
CString hex = _T("FAB");
CString decimal = _T("4011");
ASSERT(_tcstoul(hex, 0, 16) == _ttoi(decimal));
在做DWORD與 CString 比較的時候 ,需要將CString 轉換成 DWORD,有幾種轉換方法,但是明明轉換結果是一樣的,可就是提示不相等,後來 _tcstoul()轉換後才相等 ,記錄下
CString str = lp->GetSubItem(nCol);
// MessageBox(str,m_strItem,MB_OK);
DWORD dwData = _tcstoul( str, NULL, 10 ); // 10進制
if (dwItem ==dwData)
{
//AfxMessageBox("找到找到找到找到找到找到找到找到找到找到找到找到找到");
return pCur;
}
使用_tcstoul()或者_tcstol(),它們都能把字符串轉化成任意進制的長整數(如二進制、八進制、十進制或十六進制),不同點在於前者轉化後的數據是無符號的(unsigned),而後者相反。看下面的例子:
CString hex = _T("FAB");
CString decimal = _T("4011");
ASSERT(_tcstoul(hex, 0, 16) == _ttoi(decimal));
////////////////////////////////////////////////////////////////////////////////////////////////////
Format函數
首先看它的聲明:
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);
由於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]);
好了,第一個總算講完了,應該對他的應用很熟悉了吧
///////////////////////////////////////////////////////////////
二 FormatDateTime的用法
他的聲明爲:
function FormatDateTime(const Format: string; DateTime: TDateTime): string;
overload;
當然和Format一樣還有一種,但這裏只介紹常用的第一種
Format參數是一個格式化字符串。DateTime是時間類型。返回值是一種格式化後的
字符串
重點來看Format參數中的指令字符
c 以短時間格式顯示時間,即全部是數字的表示
FormatdateTime('c',now);
輸出爲:2004-8-7 9:55:40
d 對應於時間中的日期,日期是一位則顯示一位,兩位則顯示兩位
FormatdateTime('d',now);
輸出可能爲1~31
dd 和d的意義一樣,但它始終是以兩位來顯示的
FormatdateTime('dd',now);
輸出可能爲01~31
ddd 顯示的是星期幾
FormatdateTime('ddd',now);
輸出爲: 星期六
dddd 和ddd顯示的是一樣的。
但上面兩個如果在其他國家可能不一樣。
ddddd 以短時間格式顯示年月日
FormatdateTime('ddddd',now);
輸出爲:2004-8-7
dddddd 以長時間格式顯示年月日
FormatdateTime('dddddd',now);
輸出爲:2004年8月7日
e/ee/eee/eeee 以相應的位數顯示年
FormatdateTime('ee',now);
輸出爲:04 (表示04年)
m/mm/mmm/mmmm 表示月
FormatdateTime('m',now);
輸出爲:8
FormatdateTime('mm',now);
輸出爲 08
FormatdateTime('mmm',now);
輸出爲 八月
FormatdateTime('mmmm',now);
輸出爲 八月
和ddd/dddd 一樣,在其他國家可能不同
yy/yyyy 表示年
FormatdateTime('yy',now);
輸出爲 04
FormatdateTime('yyyy',now);
輸出爲 2004
h/hh,n/nn,s/ss,z/zzz 分別表示小時,分,秒,毫秒
t 以短時間格式顯示時間
FormatdateTime('t',now);
輸出爲 10:17
tt 以長時間格式顯示時間
FormatdateTime('tt',now);
輸出爲10:18:46
ampm 以長時間格式顯示上午還是下午
FormatdateTime('ttampm',now);
輸出爲:10:22:57上午
大概如此,如果要在Format中加普通的字符串,可以用雙引號隔開那些
特定義的字符,這樣普通字符串中如果含特殊的字符就不會被顯示爲
時間格式啦:
FormatdateTime('"today is" c',now);
輸出爲:today is 2004-8-7 10:26:58
時間中也可以加"-"或""來分開日期:
FormatdateTime('"today is" yy-mm-dd',now);
FormatdateTime('"today is" yymmdd',now);
輸出爲: today is 04-08-07
也可以用":"來分開時間
FormatdateTime('"today is" hh:nn:ss',now);
輸出爲:today is 10:32:23
/////////////////////////////////////////////////////////////////
三.FormatFloat的用法
常用的聲明:
function FormatFloat(const Format: string; Value: Extended): string; overload;
和上面一樣Format參數爲格式化指令字符,Value爲Extended類型
爲什麼是這個類型,因爲它是所有浮點值中表示範圍最大的,如果傳入該方法的參數
比如Double或者其他,則可以保存不會超出範圍。
關鍵是看Format參數的用法
0 這個指定相應的位數的指令。
比如:FormatFloat('000.000',22.22);
輸出的就是022.220
注意一點,如果整數部分的0的個數小於Value參數中整數的位數,則沒有效果
如:FormatFloat('0.00',22.22);
輸出的是:22.22
但如果小數部分的0小於Value中小數的倍數,則會截去相應的小數和位數
如:FormatFloat('0.0',22.22);
輸出的是:22.2
也可以在整數0中指定逗號,這個整數位數必須大於3個,纔會有逗號出句
FormatFloat('0,000.0',2222.22);
輸出是:2,222.2
如果這樣FormatFloat('000,0.0',2222.22);
它的輸出還是:2,222.2
注意它的規律
# 和0的用法一樣,目前我還沒有測出有什麼不同。
FormatFloat('##.##',22.22);
輸出是:22.00
E 科學表示法,看幾個例子大概就明白了
FormatFloat('0.00E+00',2222.22);
輸出是 2.22E+03
FormatFloat('0000.00E+00',2222.22);
輸出是 2222.22E+00
FormatFloat('00.0E+0',2222.22);
22.2E+2
明白了嗎,全靠E右邊的0來支配的。
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
ANSI 和 UNICODE 的函數對應表
ANSI UNICODE 通用
(char.h) (wchar.h) (tchar.h)
char wchar_t TCHAR
char * wchar_t * PTCHAR (PTSTR,LPWSTR,PWSTR,WCHAR)
printf wprintf _tprintf
scanf wscanf _tscanf
atoi _wtoi _ttoi
atol _wtol _ttol
itoa _itow _itot
ltoa _ltow _ltot
atof _wtof _tstof
strlen wcslen _tcslen
strcat wcscat _tcscat
strcpy wcscpy _tcscpy
strcmp wcscmp _tcscmp
|
ASCII |
UNICODE |
TCHAR |
VS2005 |
int |
atoi |
_wtoi |
_tstoi _ttoi |
_atoi_l _wtoi_l |
long |
atol |
_wtol |
_tstoi _ttoi |
_atoi_l _wtoi_l |
__int64 |
_atoi64 |
_wtoi64 |
_tstoi64 _ttoi64 |
_atoi64_l _wtoi64_l |
float |
|
|
|
_atoflt _atoflt_l |
double |
atof |
_wtof |
_tstof _ttof |
_atof_l _wtof_l _atodbl _atodbl_l |
long double |
|
|
|
_atoldbl _atoldbl_l |
Convert string to float |
|
Convert string to int |
|
Convert string to __int64 |
|
Convert string to long |
|
Convert double to string of specified length |
|
Convert double to string with specified number of digits following decimal point |
|
Convert double number to string; store string in buffer |
|
_itoa, _i64toa, _ui64toa, _itow, _i64tow, _ui64tow, _itoa_s, _i64toa_s, _ui64toa_s, _itow_s, _i64tow_s, _ui64tow_s |
Convert int or __int64 to string |
Convert long to string |
|
Convert string to double |
|
Convert string to long integer |
|
Convert string to unsigned long integer |
|
Convert unsigned long to string |
|
Convert wide-character string to a double |
|
Convert wide-character string to int |
|
Convert wide-character string to __int64 |
|
Convert wide-character string to long |
///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
ASSERT()是一個調試程序時經常使用的宏,在程序運行時它計算括號內的表達式,如果表達式爲FALSE (0), 程序將報告錯誤,並終止執行。如果表達式不爲0,則繼續執行後面的語句。這個宏通常原來判斷程序中是否出現了明顯非法的數據,如果出現了終止程序以免導致嚴重後果,同時也便於查找錯誤。
ASSERT只有在Debug版本中才有效,如果編譯爲Release版本則被忽略。
---------------------------------------------------------------
ASSERT宏定義如下
#define ASSERT(f) /
do /
{ /
if (!(f) && AfxAssertFailedLine(THIS_FILE, __LINE__)) /
AfxDebugBreak(); /
} while (0) /
ASSERT(邏輯表達式)
如果括號中的邏輯表達式值爲假的話,會彈出調試命令窗口,提示具體在哪個文件的哪一行發生了斷言錯誤!
---------------------------------------------------------------
ASSERT
Evaluates an expression, and displays a diagnostic message if the expression is FALSE. Ignored in retail builds.
Syntax
ASSERT(
cond
);
Parameters
cond
Expression to evaluate.
Remarks
In debug builds, if the expression is FALSE, this macro displays a message box with the text of the expression, the name of the source file, and the line number. The user can ignore the assertion, enter the debugger, or quit the application.
Example
ASSERT(rtStartTime <= rtEndTime);
---------------------------------------------------------------
斷言(ASSERT)的使用,方法很簡單。爲什麼要用,初學者可能比較迷惑。
契約式編程講的比較清楚,建議可以先看看這類書。
一個函數由前置條件、後置條件和不變式組成。在VC中,我們可以通過斷言來保證這三個條件。可以大大提高了軟件的質量。
---------------------------------------------------------------
如果ASSERT()中的條件不成立(比如 ASSERT(0) ; ),會彈出一個比較嚇人的對話框。
點擊重試,可以到達 ASSERT 斷言不成立的那一行,
此時可以在watch窗口查看變量值,找出出錯的原因。
如果程序能夠繼續運行,可以按F5繼續調試。