Ложно-положительный, используя string.length в операторе if - PullRequest
2 голосов
/ 02 декабря 2011

Я пытаюсь отформатировать телефонные номера.Возможно, мой подход не самый лучший, но он работает, за исключением некоторого неожиданного поведения.Я использую string.length в операторе if, чтобы узнать, больше ли длина телефонного номера (хранится в виде строки), чем 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);

Возникло исключение, и "Индекс и длина должны указывать на местоположение в строке. Имя параметра: длина" возвращается.

Ответы [ 4 ]

4 голосов
/ 02 декабря 2011

Я положил его в метод модульного тестирования, и он работает. Вы, очевидно, получаете дополнительный символ, добавленный к строке 828464047. Вы можете отладить и поместить точку останова в оператор IF и посмотреть, что на самом деле находится в ANI.

Несколько вещей,

  • Не называйте переменную чем-то двусмысленным, например, "ANI".
  • переименуйте Number1 во что-то вроде «firstNumber»
  • A try / Catch не требуется для этого оператора, если вы получаете исключение, вы делаете что-то, что можно решить с помощью лучшего кодирования.
3 голосов
/ 02 декабря 2011

Я могу видеть ANI.TrimStart() в вашем коде, что заставляет меня подозревать, что у вас есть пробелы. Вероятно, лучше всего решить проблему, переместив обрезку за пределы if.

Можно с уверенностью предположить, что что-то столь же фундаментальное, как String.Length, работает правильно. Когда в нем говорится, что ваша строка имеет определенную длину, ваша строка действительно будет такой длины.

0 голосов
/ 05 декабря 2011

Проблема заключалась в удалении первой «1» после оценки длины строки. Снятие '1' bef

0 голосов
/ 02 декабря 2011

Я бы проверил ваши входные данные на наличие пробелов или, возможно, вы неправильно вписали свой ввод здесь. Следующие тесты проходят против вашего кода, скопированы и вставлены:

    [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"));
    }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...