zoukankan      html  css  js  c++  java
  • 字符串是否为数字及有效性检查

    在编写MFC窗体程序时,我们经常要判断用户输入的一个字符串是否合法有效,以此来增强程序的健壮性。

    最近,在测试系统的对话框的输入时,发现存在大量这样的问题,甚至有一些特定变态的输入还导致系统异常退出。

    为了解决这些问题,我编写下面这个头文件,来判断输入的字符串是否为数字,以及是否在有效范围之内。

    希望以下代码对你有用!

    #ifndef __CT3D__CHECKVALIDVAL__H__
    #define __CT3D__CHECKVALIDVAL__H__
    
    class CStringEx
    {
    private:
    	CString m_str;
    	int m_dot_count;
    	
    public:
    	CStringEx()
    	{
    		m_dot_count = 0;
    	}
    	CStringEx(const CString& s)
    	{
    		m_str = s;
    	}
    	virtual ~CStringEx()
    	{
    	}
    
    public:
    	bool isFloat()
    	{
    		if (m_str.IsEmpty())
    			return false;
    
    		m_dot_count = 0;
    
    		int start_pos = 0;
    		char c = m_str.GetAt(0);
    		if (c=='+' || c=='-')
    			start_pos = 1;
    
    		int length = m_str.GetLength();
    		for (int i=start_pos; i<length; i++)
    		{
    			c = m_str.GetAt(i);
    			if (c=='.')
    			{
    				m_dot_count++;
    				continue;
    			}
    
    			if (c<0x30 || c>0x39)
    				return false;
    		}
    
    		if (m_dot_count>1) // ..23.
    			return false;
    		if (length==1 && (start_pos==1 || m_dot_count==1))// . or +
    			return false;
    		if (length==2 && start_pos==1 && m_dot_count==1) // +.
    			return false;
    
    		return true;
    	}
    
    	bool isInterger()
    	{
    		if (m_str.IsEmpty())
    			return false;
    
    		int start_pos = 0;
    		char c = m_str.GetAt(0);
    		if (c=='+' || c=='-')
    			start_pos = 1;
    
    		int length = m_str.GetLength();
    		for (int i=start_pos; i<length; i++)
    		{
    			c = m_str.GetAt(i);
    			if (c<0x30 || c>0x39)
    				return false;
    		}
    
    		if (length==1 && start_pos==1)// +
    			return false;
    
    		return true;
    	}
    
    	bool isValidFloat(double minVal, double maxVal, bool isHasMin=true, bool isHasMax=true)
    	{
    		if (maxVal<minVal)
    		{
    			double a = minVal;
    			minVal = maxVal;
    			maxVal = a;
    		}
    
    		if (!isFloat())
    			return false;
    
    		double d = atof(LPCTSTR(m_str));
    		if (isHasMin && d<minVal)
    			return false;
    		if (isHasMax && d>maxVal)
    			return false;
    
    		return true;
    	}
    
    	bool isValidInterger(int minVal, int maxVal, bool isHasMin=true, bool isHasMax=true)
    	{
    		if (maxVal<minVal)
    		{
    			int a  = minVal;
    			minVal = maxVal;
    			maxVal = a;
    		}
    
    		if (!isInterger())
    			return false;
    
    		int d = atoi(LPCTSTR(m_str));
    		if (isHasMin && d<minVal)
    			return false;
    		if (isHasMax && d>maxVal)
    			return false;
    
    		return true;
    	}	
    };
    
    // 全局函数
    class CStringValid
    {
    public:
    	static bool CStringValid::strIsFloat(const CString& s)
    	{
    		CStringEx sx = s;
    		return sx.isFloat();
    	}
    
    	static bool CStringValid::strIsInterger(const CString& s)
    	{
    		CStringEx sx = s;
    		return sx.isInterger();
    	}
    
    	static bool CStringValid::strIsFloatValid(const CString& s, double minVal, double maxVal, bool isHasMin=true, bool isHasMax=true)
    	{
    		CStringEx sx = s;
    		return sx.isValidFloat(minVal, maxVal, isHasMin, isHasMax);
    	}
    
    	static bool CStringValid::strIsIntergerValid(const CString& s, int minVal, int maxVal, bool isHasMin=true, bool isHasMax=true)
    	{
    		CStringEx sx = s;
    		return sx.isValidInterger(minVal, maxVal, isHasMin, isHasMax);
    	}
    };
    
    
    #endif
    
  • 相关阅读:
    3种Java从文件路径中获取文件名的方法
    win10系统下点击关机却自动重启的问题解决思路
    Eclipse窗口总是在最前的解决办法
    tomcat端口被占用
    js页面跳转整理(转载未整理)
    java.lang.IllegalArgumentException 不合法的参数异常
    MySQL如何查询两个日期之间的记录
    web -- 前端访问后台跨区问题解决
    Maven -- 发布jar包至远程仓库
    5 -- Hibernate的基本用法 --4 3 JDBC连接属性
  • 原文地址:https://www.cnblogs.com/kekec/p/1936287.html
Copyright © 2011-2022 走看看