我想让用户在CEdit中输入的数据为FLOAT型,否则弹出MessageBox错误提示。
不用为其加数据变量的方法验证,想自己用函数验证,可不成功
GetDlgItemText(IDC_EDIT_TEST,&strTemp);
fltTemp=atof(strTemp);
可当CEDIT中的数据含有非数字时,strTemp中的内容是对的,可fltTemp总是为0该如何编写,使CEdit中的数据只能为FLOAT型,否则要用户重填

解决方案 »

  1.   

    既然你知道非数字的时候得到的是总是0,但是字符串是正确的,你就不能从atof的结果来判断了。
    你应该检测字符串中的每一个字符。看一看有没有小数点对应的字符和有没有数字以外的字符。
      

  2.   

    try
    {
    GetDlgItemText(IDC_EDIT_TEST,&strTemp);
    fltTemp=atof(strTemp);
    return true;
    }
    catch(...)
    {
    ::AfxMessageBox("Error")
    return false;
    }
    这样就可以了
      

  3.   

    那从中取出字符串CString后如何判断呢?
    什么函数可以得出其长度和求出知道位置的单个字符呢
      

  4.   

    你自己重载一个CEdit 在里面相应WM_CHAR
    加入你自己的逻辑判断,就可以完美的解决了!
    想实现什么样的逻辑规则都可以!
    呵呵!!!!
    ---------------------------派生一个CEdit的类,添加一个成员变量CString strDigital;
    ---------------------------------------------
    CFloatEdit:public CEdit
    {...
    public:
    CString strDigital;
    };
    void CFloatEdit::OnChar(UINT nChar, UINT nRepCnt, UINT nFlags) 
    {
    // TODO: Add your message handler code here and/or call default
       if(::isdigit(nChar))
    CEdit::OnChar(nChar, nRepCnt, nFlags);
      else if(nChar=='.')//is '.'
      {
    int pos=strDigital.Find('.');
    if(pos==-1&&!strDigital.IsEmpty())//only receives first '.' and not at first position of the string
      CEdit::OnChar(nChar, nRepCnt, nFlags);
      }
      else if(nChar==VK_BACK||nChar==VK_DELETE)//make sure to edit it!
    CEdit::OnChar(nChar, nRepCnt, nFlags);
       GetWindowText(strDigital);
    }
      

  5.   

    然后用CFloatEdit 代替你原来的CEdit
    至于怎么代替,那就随你的便了!
      

  6.   

    psusong(我心飞扬) :的方法我知道,可这样不现实
    因为我如果这样做还不如直接加变量,进行数据验证呢因为我的对话框上有169个CEDIT,所以不可能重载的