C#校验13位长度手机号码抛出ArgumentOutOfRangeException如何解决
问题原因
- 未提前校验
Phone字符串长度:当Phone长度小于13时,循环中调用Substring获取指定位置字符会触发ArgumentOutOfRangeException异常 - 冗余逻辑无效:
Phone.Substring().Contains("")==false的判断永远不会生效,所有非空字符串都包含空字符串,该判断没有实际作用 - 原有逻辑没有校验非数字字符:如果
Phone中存在非数字字符,int.Parse也会抛出异常 - 原有校验位逻辑不完整:没有将计算得到的校验位和第13位实际字符做比对,校验逻辑无效
解决方案
情况1:需求仅为校验号码是否为13位字符
直接判断字符串长度即可,代码非常简洁:
public bool CheckPhone() { // 空值自动返回false,仅当长度恰好为13时返回true return Phone?.Length == 13; }
情况2:需要同时校验13位号码的校验位
先做长度校验,再优化后续计算逻辑,避免所有异常场景:
public bool CheckPhone() { // 长度不符合直接返回false,同时处理Phone为null的情况 if (Phone?.Length != 13) { return false; } int sum = 0; // 遍历前12位计算加权和 for (int i = 0; i < 12; i++) { char currentChar = Phone[i]; // 非数字直接返回false,避免转换异常 if (!char.IsDigit(currentChar)) { return false; } sum += (currentChar - '0') * (13 - (i + 1)); } int rest = (sum * 11) % 12; if (rest == 11 || rest == 12) { rest = 0; } // 校验最后一位是否和计算结果一致 return (Phone[12] - '0') == rest; }
内容的提问来源于stack exchange,提问作者Leonardo Cani Schumann
相关产品推荐
相关产品推荐

