if语句中使用string.length的误报

时间:2011-12-02 15:57:17

标签: c# string if-statement

我正在尝试格式化电话号码。也许我的方法不是最好的,但除了一些意想不到的行为外,它的作用。我在if语句中使用string.length来查看电话号码的长度(存储为字符串)是否大于9.我还尝试了> = 10而不是> 9具有相同的结果。所有工作正常18001234567或7041234567.我得到(800)123-4567或(704)123-4567。但是对于828464047,我得到(82)846-4047,而不是按原样返回的数字。

try
{
    if (ANI.Length > 9)
    {
        char[] Number1 = { '1' };
        ANI = ANI.TrimStart(Number1);
        return String.Format("{0:(###) ###-####}", Convert.ToDouble(ANI));
    }
    else if (ANI == "")
    {
        return "Private";
    }
    else
    {
        return ANI;
    }
}
catch (Exception ex)
{
    return ex.Message;
}

有什么想法吗?有没有更好的方法来解决这个问题?

感谢。

如果我更改格式化电话号码的代码以使用子字符串,事情就会如预期那样中断。

return "(" + ANI.Substring(0, 3) + ") " + ANI.Substring(3, 3) + "-" + ANI.Substring(6, 4);

捕获异常并且“索引和长度必须引用字符串中的位置。返回参数名称:length”。

4 个答案:

答案 0 :(得分:4)

我把它放入一个单元测试方法,它的工作原理。你显然在字符串828464047上添加了一个额外的字符。你可以调试并在IF语句中放置一个断点,看看ANI中的实际内容。

还有一些事情,

  • 不要将变量命名为“ANI”之类的歧义。
  • 将Number1重命名为“firstNumber”
  • 此声明不需要 try / Catch ,如果您遇到异常,那么您正在做一些可以通过更好的编码解决的问题。

答案 1 :(得分:3)

我可以在你的代码中看到ANI.TrimStart(),这让我怀疑你有一些领先的空白。您可以通过将修剪移动到if之外来最好地解决问题。

可以非常安全地假设像String.Length这样基本的东西正常工作。当它说你的字符串是一定的长度时,你的字符串真的就是那个长度。

答案 2 :(得分:0)

我会检查您输入的空格,或者您可能在这里转录了输入错误。以下测试通过您的代码,复制并粘贴:

    [TestMethod, Owner("ebd"), TestCategory("Proven"), TestCategory("Unit")]
    public void Ten_Digit_800_Number()
    {
        var myPad = new NumberFormatter();

        Assert.AreEqual<string>("(800) 123-4567", myPad.FormatNumber("18001234567"));
    }

    [TestMethod, Owner("ebd"), TestCategory("Proven"), TestCategory("Unit")]
    public void Ten_Digit_800_Number()
    {
        var myPad = new NumberFormatter();

        Assert.AreEqual<string>("(800) 123-4567", myPad.FormatNumber("18001234567 "));
    }

    [TestMethod, Owner("ebd"), TestCategory("Proven"), TestCategory("Unit")]
    public void TroubleString()
    {
        var myPad = new NumberFormatter();

        Assert.AreEqual<string>("828464047", myPad.FormatNumber("828464047"));
    }

答案 3 :(得分:-1)

问题是在评估字符串的长度后剥离了前导'1'。剥离'1'bef