一客戶要求定製一對話方塊,顯示幾個資料,本以為幾分鐘就能搞定的事,卻突然被一要求砸暈:客戶要求其中一編輯框顯示百分比,而且小數點必須是兩位,也就是是說,如果是百分比為0的話,就要顯示0.00。雖然情急之下用cstring來關聯編輯框,加上format成員函式和scanf函式,也很快搞定。但也驚出一身冷汗,發現原來最簡單的東西下面還有不簡單啊。
後仔細查閱資料,並翻看mfc原始碼,發現確實沒有簡單的方法來實現。用cstring作為變數,再定義一double變數,再轉換,這種方法也頗為可行,但是有一點,要自己新增判斷字串是否是double型別數字,即簡單的驗證資料,有點麻煩。
查查原始碼,可以發現mfc的ddx_text(cdataexchange* pdx, int nidc, double& value)和其它的幾個ddx_text的內部實現不同,甚至於實現的檔案也不同,分別在dlgfloat.cpp和dlgdata.cpp中
void afxapi ddx_text(cdataexchange* pdx, int nidc, double& value)
void afxapi ddx_text(cdataexchange* pdx, int nidc, dword& value)
追蹤afxtextfloatformat的實現如下:
void afxapi afxtextfloatformat(cdataexchange* pdx, int nidc,
void* pdata, double value, int nsizegcvt)
if (nsizegcvt == flt_dig)
*((float*)pdata) = (float)d;
else
*((double*)pdata) = d; }
else
}可以發現其實我們只要改動
_stprintf(szbuffer, _t("%.*g"), nsizegcvt, value);
afxsetwindowtext(hwndctrl, szbuffer);
這部分**就可以實現我們的目的了。
1.新建一測試工程tddx
2.在對話方塊模板中新增一編輯框,關聯雙精度變數double m_fpercent
3.新增自定義的資料交換函式
extern void afxapi afxtextfloatformat(cdataexchange* pdx, int nidc,
void* pdata, double value, int nsizegcvt);
void ctddxdlg::ddxex_text(cdataexchange *pdx, int nidc, double &value, lpctstr lpszformat)
else }
這裡afxtextfloatformat被定義為全域性函式,所以我們只需要匯入即可。
4.修改dodataexchange如下:
void ctddxdlg::dodataexchange(cdataexchange* pdx)
}afx_data_map
ddxex_text(pdx, idc_edit_percent, m_fpercent, "%0.2f"); }
執行即可發現已經實現目標如果在編輯框中輸入非數字,會發現有錯誤提示。
差點忘了,由於dbl_dig的存在,需要#include
單雙精度浮點數
浮點數並不一定等於小數 定點數也並不一定就是整數。所謂浮點數就是小數點在邏輯上是不固定的,而定點數只能表示小數點固定的數值,具用浮點數或定點數表示某哪一種數要看使用者賦予了這個數的意義是什麼。c 中的浮點數有6種,分別是 float 單精度,32位 unsigned float 單精度無符號,32位...
單雙精度浮點數的IEEE標準格式
目前大多數高階語言 包括c 都按照ieee 754標準來規定浮點數的儲存格式,ieee754規定,單精度浮點數用4位元組儲存,雙精度浮點數用 8位元組儲存,分為三個部分 符號位 階和尾數。階即指數,尾數即有效小數字數。單精度格式階佔8位,尾數佔24位,符號位1位,雙精度則為11為階,53 位尾數和1...
matlab雙精度浮點數編碼及區間覆蓋
matlab預設以64位雙精度浮點格式儲存資料於工作空間 workspace 第0位到第51位為小數部分,第52位到62位為指數部分,第63位為符號 正或負 部分。從排列組合的角度考慮,共有64個二進位制位,每個位有0和1兩種狀態,因此64位最多能夠表示的狀態數為2 64個,即最多能夠表示2 64個...