将字符串转换为数字
2015-09-22 09:18
309 查看
一、题目:将字符串转换为数字
题目:写一个函数StrToInt,实现把字符串转换成整数这个功能。当然,不能使用atoi或者其他类似的库函数。
二、代码实现
(1)考虑输入的字符串是否是NULL、空字符串(2)考虑输入的字符串是否包含正负号或者是否是只包含正负号
(3)考虑输入的字符串是否会发生上溢或下溢(正整数的最大值是0x7FFFFFFF,最小的负整数是0x80000000)
(4)考虑如何区分正常返回数字0和返回输入是否合法的标识
综上考虑,实现代码如下,这里使用C#语言描述:
①定义一个ConvertResult的结构体,作为返回值使用
public struct ConvertResult { public ConvertState State; public int Number; } public enum ConvertState { // 输入不合法 InValid = 0, // 输入合法 Valid = 1 }
②定义方法主入口,在主入口中判断输入是否含有正负号并做对应处理
public static ConvertResult StrToInt(string str) { ConvertResult result = new ConvertResult(); result.State = ConvertState.InValid; result.Number = 0; if (!string.IsNullOrEmpty(str)) { bool minus = false; char[] strArray = str.ToCharArray(); int startIndex = 0; if (strArray[startIndex] == '+') { startIndex++; } else if (strArray[startIndex] == '-') { minus = true; startIndex++; } if (startIndex != strArray.Length) { StrToIntCore(strArray, startIndex, minus, ref result); } } return result; }
③定义核心方法StrToIntCore,将字符串转换为数字并为ConvertResult实例赋值,在此方法中判断是否发生上溢或下溢
private static void StrToIntCore(char[] strArray, int index, bool minus, ref ConvertResult result) { long number = 0; while (index < strArray.Length) { if (strArray[index] >= '0' && strArray[index] <= '9') { // 首先需要注意正负号 int flag = minus ? -1 : 1; number = number * 10 + flag * (strArray[index] - '0'); // 正整数的最大值是0x7FFFFFFF,最小的负整数是0x80000000 // 因此需要考虑整数是否发生上溢出或者下溢出 if ((flag == 1 && number > int.MaxValue) || (flag == -1 && number < int.MinValue)) { number = 0; break; } index++; } else { number = 0; break; } } if (index == strArray.Length) { result.State = ConvertState.Valid; result.Number = (int)number; } }
三、单元测试
3.1 测试用例
// 鲁棒性测试:NULL指针 [TestMethod] public void StringToIntTest1() { ConvertResult actual = StringHelper.StrToInt(null); Assert.AreEqual(actual.State, ConvertState.InValid); } // 鲁棒性测试:空字符串 [TestMethod] public void StringToIntTest2() { ConvertResult actual = StringHelper.StrToInt(""); Assert.AreEqual(actual.State, ConvertState.InValid); } // 功能测试:普通的数字字符串 [TestMethod] public void StringToIntTest3() { ConvertResult actual = StringHelper.StrToInt("123"); Assert.AreEqual(actual.State, ConvertState.Valid); Assert.AreEqual(actual.Number, 123); } // 功能测试:带正负号的数字字符串 [TestMethod] public void StringToIntTest4() { ConvertResult actual = StringHelper.StrToInt("+123"); Assert.AreEqual(actual.State, ConvertState.Valid); Assert.AreEqual(actual.Number, 123); } // 功能测试:带正负号的数字字符串 [TestMethod] public void StringToIntTest5() { ConvertResult actual = StringHelper.StrToInt("-123"); Assert.AreEqual(actual.State, ConvertState.Valid); Assert.AreEqual(actual.Number, -123); } // 功能测试:带正负号的字符串0 [TestMethod] public void StringToIntTest6() { ConvertResult actual = StringHelper.StrToInt("+0"); Assert.AreEqual(actual.State, ConvertState.Valid); Assert.AreEqual(actual.Number, 0); } // 功能测试:带正负号的字符串0 [TestMethod] public void StringToIntTest7() { ConvertResult actual = StringHelper.StrToInt("-0"); Assert.AreEqual(actual.State, ConvertState.Valid); Assert.AreEqual(actual.Number, 0); } // 特殊输入测试:非数字字符串 [TestMethod] public void StringToIntTest8() { ConvertResult actual = StringHelper.StrToInt("1a33"); Assert.AreEqual(actual.State, ConvertState.InValid); Assert.AreEqual(actual.Number, 0); } // 特殊输入测试:有效的最大正整数 0x7FFFFFFF [TestMethod] public void StringToIntTest9() { ConvertResult actual = StringHelper.StrToInt("+2147483647"); Assert.AreEqual(actual.State, ConvertState.Valid); Assert.AreEqual(actual.Number, 2147483647); } [TestMethod] public void StringToIntTest10() { ConvertResult actual = StringHelper.StrToInt("-2147483647"); Assert.AreEqual(actual.State, ConvertState.Valid); Assert.AreEqual(actual.Number, -2147483647); } [TestMethod] public void StringToIntTest11() { ConvertResult actual = StringHelper.StrToInt("+2147483648"); Assert.AreEqual(actual.State, ConvertState.InValid); Assert.AreEqual(actual.Number, 0); } // 特殊输入测试:有效的最小负整数 0x80000000 [TestMethod] public void StringToIntTest12() { ConvertResult actual = StringHelper.StrToInt("-2147483648"); Assert.AreEqual(actual.State, ConvertState.Valid); Assert.AreEqual(actual.Number, -2147483648); } [TestMethod] public void StringToIntTest13() { ConvertResult actual = StringHelper.StrToInt("+2147483649"); Assert.AreEqual(actual.State, ConvertState.InValid); Assert.AreEqual(actual.Number, 0); } [TestMethod] public void StringToIntTest14() { ConvertResult actual = StringHelper.StrToInt("-2147483649"); Assert.AreEqual(actual.State, ConvertState.InValid); Assert.AreEqual(actual.Number, 0); } // 特殊输入测试:只有一个正号 [TestMethod] public void StringToIntTest15() { ConvertResult actual = StringHelper.StrToInt("+"); Assert.AreEqual(actual.State, ConvertState.InValid); Assert.AreEqual(actual.Number, 0); } // 特殊输入测试:只有一个负号 [TestMethod] public void StringToIntTest16() { ConvertResult actual = StringHelper.StrToInt("-"); Assert.AreEqual(actual.State, ConvertState.InValid); Assert.AreEqual(actual.Number, 0); }
3.2 测试结果
(1)测试用例通过情况![](http://images2015.cnblogs.com/blog/381412/201509/381412-20150920210411726-483953896.png)
(2)代码覆盖率统计
![](http://images2015.cnblogs.com/blog/381412/201509/381412-20150920210524554-1154590620.png)
作者:周旭龙
出处:http://edisonchou.cnblogs.com
相关文章推荐
- 吃豆子过桥问题
- 面向对象程序设计(OOP)的六大原则
- 极客学院年VIP卡原价260的F码,200出售
- 理解MySQL——索引与优化
- Android中getWidth()和getMeasureWidth()的区别探究
- 【jquery】 API讲解 内部培训资料
- android studio Mac版/eclipse Mac版运行内存不足
- Mel频率倒谱系数
- windows下写日志文件的代码
- KMeans算法的K值以及初始类簇中心点的选取
- Linux网络IO模型
- 如何将Excel 图表导出
- IT趣谈:关于所谓”XcodeGhost”的澄清
- tomcat-session-redis配置(session共享)
- 第5章 基础构建模块
- Jquery 较好的效果
- C语言编译过程简介
- Linux 软件安装时--prefix选项的作用
- setTimout clearTimeout
- 重载和重写的区别