输入字符串只能是数字或者分数

BOOL IcUiNumericEdit::IsMatchChar(UINT nChar)
{
    //首先如果不是 0-9, '.','/',Backspace,直接返回 0的ASCII 48, 9的ASCII 57, /的ASCII 47,点.的ASCII 46. backspace 8

    if(nChar == '.' || (nChar >= '0' && nChar <= '9') || nChar == '/'  || nChar == 8)
    {
        CString strRet;
        GetWindowText(strRet);
        int nLen = strRet.GetLength();
        if(nChar == '/')    //如果nChar为‘/'。 返回错误情况: 1. 作为字符串首,2. 前面为'.' 3. 前已存在‘/'时
        {
            if(strRet.Trim().IsEmpty())
                return FALSE;
            
            if(strRet.GetAt(nLen - 1) == '.')    //最后一个为'.'
                return FALSE;
            if(strRet.Find('/') != -1)    // -1 表示没有找到
                return FALSE;
        }
        else if(nChar == '.') //如果nChar为 '.' 返回错误情况 1.作为字符串首 2. 前为‘.',‘/’时。 3. 存在斜线了,判断其后是否已存在'.',如果不存在判断’/‘前是否存在
        {
            if(strRet.Trim().IsEmpty())
                return FALSE;
            int nLen = strRet.GetLength();
            if(strRet.GetAt(nLen - 1) == '.' || strRet.GetAt(nLen - 1) == '/')
                return FALSE;
            if(strRet.Find('/') == -1) // 当前没有'/'
            {
                if(strRet.Find('.') != -1)
                    return false;
            }
            else
            {
                //获取当前'/'后的字符串,如果后面字符串中存在.,则返回false
                int nStart = strRet.Find('/');
                CString strSub = strRet.Right(nLen - nStart - 1);
                if(strSub.Find('.') != -1)
                    return FALSE;
            }

        }
        return TRUE;
    }
    return FALSE;
}
原文地址:https://www.cnblogs.com/sdnyzhl/p/4217734.html