我正在尝试格式化电话号码。也许我的方法不是最好的,但除了一些意想不到的行为外,它的作用。我在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”。
答案 0 :(得分:4)
我把它放入一个单元测试方法,它的工作原理。你显然在字符串828464047上添加了一个额外的字符。你可以调试并在IF语句中放置一个断点,看看ANI中的实际内容。
还有一些事情,
答案 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