MFC提供的CEdit控件,可以设置其属性为NUM,也就是限定只能输入数字,但是,有个问题就是小数点没法输入了。
在订单系统编写的时候,我想限制价钱和重量的输入只能是数字,整数或者浮点数。因为都是正数,所以我就没有考虑负号的因素,有兴趣的可以加上这一功能。
所以,只能自己编写一个数字的CEdit控件,过程:
1.从标准CEdit控件派生出CNumEdit控件
2.重载CEdit的On
void CNumEdit::On
{
// TODO: Add your message handler co
CString ss;
char ch = char(nChar);
GetWindowText(ss); // 获得当前已输入的字符序列
// 对当前输入字符进行判断
if(!isdigit(ch)) // 如果不是数字
{
if(ch == '.') // 是小数点
{
if(ss.Find('.') != -1) // 检查是否已经输入了小数点
return;
}
else // 不是小数点
{
if(ch == '\b') // 是退格键
{
;
}
else // 不是退格键,则退出
return;
}
}
CEdit::On
}
3.在输入结束后,模仿CEdit的数字规范化的功能,也就是类似0011-->11、11.100 ->11.1 .1100->0.11
重载CEdit的On
void CNumEdit::On
{
CEdit::On
// TODO: Add your message handler co
GetWindowText(m_sValue);
int i;
char ch;
int nLen = m_sValue.GetLength();
if(nLen == 0)
return;
ch = m_sValue[0];
for(i = 0; i < nLen; i++)
{
if(m_sValue[i] != '0') // 直到第一个不是0的字符
break;
}
if(i < nLen) // 不是全 0 的情况
{
m_sValue = m_sValue.Mid(i); // 将第一个非 0 字符前面的 0 去掉
nLen = m_sValue.GetLength();
int nDotPos = m_sValue.Find('.');
if(nDotPos != -1) // 含有小数点
{
for(i = nLen - 1; i >= 0; i--)
{
if(m_sValue[i] != '0')
break;
}
m_sValue = m_sValue.Left(i + 1); // 去掉了小数后面的0
}
nLen = m_sValue.GetLength();
if(nDotPos == nLen - 1) // 小数点在最后
{
m_sValue = m_sValue.Left(nLen - 1);
}
if(nDotPos == 0) // 小数点在最开始
m_sValue = "0" + m_sValue;
}
else // 全 0
{
m_sValue = '0';
}
SetSel(0, -1);
ReplaceSel(m_sValue);
}