You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.27 17:45:01