天天看點

C#判斷一個string是否可以為數字

方案一:Try...Catch(執行效率不高)

    /// <summary>

    /// 名稱:IsNumberic

    /// 功能:判斷輸入的是否是數字

    /// 參數:string oText:源文本

    /// 傳回值: bool true:是 false:否

    /// </summary>

    /// <param name="oText"></param>

    /// <returns></returns>

    private bool IsNumberic(string oText)

    {

        try

        {

            int var1 = Convert.ToInt32(oText);

            return true;

        }

        catch

            return false;

    }

方案二:正規表達式(推薦)

a)

    using System;

    using System.Text.RegularExpressions;

    public bool IsNumber(String strNumber)

        Regex objNotNumberPattern = new Regex("[^0-9.-]");

        Regex objTwoDotPattern = new Regex("[0-9]*[.][0-9]*[.][0-9]*");

        Regex objTwoMinusPattern = new Regex("[0-9]*[-][0-9]*[-][0-9]*");

        String strValidRealPattern = "^([-]|[.]|[-.]|[0-9])[0-9]*[.]*[0-9]+$";

        String strValidIntegerPattern = "^([-]|[0-9])[0-9]*$";

        Regex objNumberPattern = new Regex("(" + strValidRealPattern + ")|(" + strValidIntegerPattern + ")");

        return !objNotNumberPattern.IsMatch(strNumber) &&

        !objTwoDotPattern.IsMatch(strNumber) &&

        !objTwoMinusPattern.IsMatch(strNumber) &&

        objNumberPattern.IsMatch(strNumber);

b)

    public static bool IsNumeric(string value)

        return Regex.IsMatch(value, @"^[+-]?\d*[.]?\d*$");

    public static bool IsInt(string value)

        return Regex.IsMatch(value, @"^[+-]?\d*$");

    public static bool IsUnsign(string value)

        return Regex.IsMatch(value, @"^\d*[.]?\d*$");

方案三:周遊

    public bool isnumeric(string str)

        char[] ch=new char[str.Length];

        ch=str.ToCharArray();

        for(int i=0;i<ch.Length;i++)

            if(ch[i]<48 || ch[i]>57)

                return false;

        return true;

    public bool IsInteger(string strIn)

        bool bolResult = true;

        if (strIn == "")

            bolResult = false;

        else

            foreach (char Char in strIn)

            {

                if (char.IsNumber(Char))

                    continue;

                else

                {

                    bolResult = false;

                    break;

                }

            }

        return bolResult;

c)

    public static bool isNumeric(string inString)

        inString = inString.Trim();

        bool haveNumber = false;

        bool haveDot = false;

        for (int i = 0; i < inString.Length; i++)

            if (Char.IsNumber(inString[i]))

                haveNumber = true;

            else if (inString[i] == '.')

                if (haveDot)

                    return false;

                    haveDot = true;

            else if (i == 0)

                if (inString[i] != '+' && inString[i] != '-')

            else

            if (i > 20)

        return haveNumber;

方案四:改寫vb的IsNumeric源代碼(執行效率不高)

//主調函數

public static bool IsNumeric(object Expression)

{

      bool flag1;

      IConvertible convertible1 = null;

      if (Expression is IConvertible)

      {

            convertible1 = (IConvertible) Expression;

      }

      if (convertible1 == null)

            if (Expression is char[])

                  Expression = new string((char[]) Expression);

                  return false;

      TypeCode code1 = convertible1.GetTypeCode();

      if ((code1 != TypeCode.String) && (code1 != TypeCode.Char))

            return Utils.IsNumericTypeCode(code1);

      string text1 = convertible1.ToString(null);

      try

            long num2;

            if (!StringType.IsHexOrOctValue(text1, ref num2))

                  double num1;

                  return DoubleType.TryParse(text1, ref num1);

            flag1 = true;

      catch (Exception)

            flag1 = false;

      return flag1;

}

//子函數

// return Utils.IsNumericTypeCode(code1);

internal static bool IsNumericTypeCode(TypeCode TypCode)

      switch (TypCode)

            case TypeCode.Boolean:

            case TypeCode.Byte:

            case TypeCode.Int16:

            case TypeCode.Int32:

            case TypeCode.Int64:

            case TypeCode.Single:

            case TypeCode.Double:

            case TypeCode.Decimal:

                  return true;

            case TypeCode.Char:

            case TypeCode.SByte:

            case TypeCode.UInt16:

            case TypeCode.UInt32:

            case TypeCode.UInt64:

                  break;

      return false;

//-----------------

//StringType.IsHexOrOctValue(text1, ref num2))

internal static bool IsHexOrOctValue(string Value, ref long i64Value)

      int num1;

      int num2 = Value.Length;

      while (num1 < num2)

            char ch1 = Value[num1];

            if (ch1 == ´&´)

                  ch1 = char.ToLower(Value[num1 + 1], CultureInfo.InvariantCulture);

                  string text1 = StringType.ToHalfwidthNumbers(Value.Substring(num1 + 2));

                  if (ch1 == ´h´)

                  {

                        i64Value = Convert.ToInt64(text1, 0x10);

                  }

                  else if (ch1 == ´o´)

                        i64Value = Convert.ToInt64(text1, 8);

                  else

                        throw new FormatException();

            if ((ch1 != ´ ´) && (ch1 != ´\u3000´))

            num1++;

//----------------------------------------------------

// DoubleType.TryParse(text1, ref num1);

internal static bool TryParse(string Value, ref double Result)

      CultureInfo info1 = Utils.GetCultureInfo();

      NumberFormatInfo info3 = info1.NumberFormat;

      NumberFormatInfo info2 = DecimalType.GetNormalizedNumberFormat(info3);

      Value = StringType.ToHalfwidthNumbers(Value, info1);

      if (info3 == info2)

            return double.TryParse(Value, NumberStyles.Any, info2, out Result);

            Result = double.Parse(Value, NumberStyles.Any, info2);

      catch (FormatException)

            flag1 = double.TryParse(Value, NumberStyles.Any, info3, out Result);

方案五: 直接引用vb運作庫(執行效率不高)

方法: 首先需要添加Visualbasic.runtime的引用

代碼中Using Microsoft.visualbasic;

程式中用Information.isnumeric("ddddd");

System.Text.RegularExpressions.Regex reg1 

       = new System.Text.RegularExpressions.Regex(@"^[-]?\d+[.]?\d*$");  

   return reg1.IsMatch(str);