表示数值的字符串

题目描述
请实现一个函数用来判断字符串是否表示数值(包括整数和小数)。
例如,字符串”+100”,”5e2”,”-123”,”3.1416”和”-1E-16”都表示数值。
但是”12e”,”1a3.14”,”1.2.3”,”+-5”和”12e+4.3”都不是。

题解:
其实,这题和前面所做的正则表达式的匹配十分相似。
表示数值的字符串遵循模式A[.[B]][E|eC]或者.B[E|eC],其中,A为数值的整数部分,B是紧跟的小数点为数值的小数部分,C紧跟着’e’或’E’为数值的指数部分。在小数里,可能没有数值的整数部分。
例如:.210等于0.210.因此A不是必须的。如果一个数没有整数部分,那么它的小数部分不能为空。
上述模式的A和C都有可能以“+”或“-”开头,B也是0-9的数位串,但是并不会有符号.
以表示数值的字符串“123.45e+6”为例:123为整数部分,45为小数部分,+6是它的指数部分。
判断一个字符串是否符合上述模式时,首先尽可能多的扫描0-9的数位(有可能起始处有‘+’或‘-’号)A,如果遇到小数点‘.’,则开始扫描小数部分B,如果遇到‘e’或‘E’,则开始扫描指数部分C

using System;
namespace 表示数值的字符串
{
    class Program
    {
        static void Main(string[] args)
        {
            //Test1
            Console.WriteLine("Test1:");
            char[] str1 = "1.25e+6".ToCharArray();
            Console.WriteLine(IsNumeric(str1) + "\n");
            //Test2
            Console.WriteLine("Test2:");
            char[] str2 = new char[] { '.','1','2','5','e','4' };
            Console.WriteLine(IsNumeric(str2) + "\n");
            //Test3
            Console.WriteLine("Test3:");
            char[] str3 = new char[] {};
            Console.WriteLine(IsNumeric(str3) + "\n");
            //Test4
            Console.WriteLine("Test4:");
            char[] str4 = "1a3.14".ToCharArray();
            Console.WriteLine(IsNumeric(str4) + "\n");
        }

        public static bool IsNumeric(char[] str)
        {
            //如果判断的字符串是空值,那么直接返回假
            if (str == null || str.Length < 1)
                return false;
            //从字符串的第一个字符开始判断,strIndex表示在字符串中的下标
            int strIndex = 0;
            //isNumberic是一个用于储存该字符串是否为数字的变量,首先为其初始化,判断小数点前面部分是否为数字
            bool isNumberic = ScanInterger(str, ref strIndex);

            //如果出现'.',则接下来是小数部分
            if (strIndex < str.Length && str[strIndex] == '.')
            {
                strIndex++;
                //为什么用||,原因如下
                //1、整数部分可能为空,如.120
                //2、小数部分可能为0,如123
                //3、整数部分和小数部分都不为0,如123.456
                isNumberic = ScanUnsignedInteger(str, ref strIndex) || isNumberic;
            }
            //如果出现'e'或'E',则接下来是指数部分
            if (strIndex < str.Length && (str[strIndex] == 'e' || str[strIndex] == 'E'))
            {
                strIndex++;
                //下面用&&的原因:
                //1、当前E或e前面没有数字,那么整个字符串不能表示数字,如“.e1”、“e1”
                //2、当前E或e后面没有整数时,那么整个字符串不能表示为数字,如“12e”
                isNumberic = ScanInterger(str, ref strIndex) && isNumberic;
            }
            //在这里添加这个判断的作用:假如A、B、C中里面除了有数字还有字符,那么判断到字符时会返回true,但是字符并未匹配完成,所以还需要进一步判断,在字符串匹配完的情况下仍然为true,那么返回true,如果isNumberic是true,但是它并没有匹配完所有的字符串,那么返回false
            if (strIndex != str.Length)
                isNumberic = false;
            return isNumberic;
        }

        /// <summary>
        /// 用于判断无符号的字符串是否为数字
        /// </summary>
        /// <param name="str">用于判断的字符串</param>
        /// <param name="strIndex">字符串索引的下标</param>
        /// <returns>返回当前一段字符串是否为数字</returns>
        private static bool ScanUnsignedInteger(char[] str, ref int strIndex)
        {
            int formerIndex = strIndex;
            while (strIndex < str.Length && str[strIndex] >= '0' && str[strIndex] <= '9')
            {
                strIndex++;
            }
            return strIndex > formerIndex;
        }

        /// <summary>
        /// 用于判断有符号的字符串是否为数字
        /// </summary>
        /// <param name="str">用于判断的字符串</param>
        /// <param name="strIndex">字符串索引的下标</param>
        /// <returns>返回当前一段字符串是否为数字</returns>
        private static bool ScanInterger(char[] str, ref int strIndex)
        {
            if (strIndex < str.Length && (str[strIndex] == '-' || str[strIndex] == '+'))
                strIndex++;
            return ScanUnsignedInteger(str, ref strIndex);
        }
    }
}

在这里博主向之前看博客的朋友们说声抱歉啦,今天查看博客,才发现少了数值字符串遵循的模式部分,可能大多数朋友看的一头懵逼,博主在这里说声抱歉啦,希望以后有看博主博客的朋友发现问题的话,可以直接评论的哟,博主看到一定会回复而且改正的。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值