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; }