Не могу понять, что делает этот SubString.PadLeft - PullRequest
0 голосов
/ 20 сентября 2008

В этом коде я отлаживаю, у меня есть фрагмент кода:

ddlExpYear.SelectedItem.Value.Substring(2).PadLeft(2, '0');

Что это возвращает? Я действительно не могу запустить это слишком много, так как это часть реального приложения кредитной карты. DropDownList, как вы можете себе представить из названия, содержит год из 4 цифр.

ОБНОВЛЕНИЕ: Спасибо всем. Я не занимаюсь разработкой .NET, поэтому настройка быстрого теста для меня не такая быстрая.

Ответы [ 11 ]

2 голосов
/ 20 сентября 2008

На консоли выводится «98».

class Program
{
    static void Main(string[] args)
    {
        Console.Write("1998".Substring(2).PadLeft(2, '0'));
        Console.Read();
    }
}
2 голосов
/ 20 сентября 2008

Он принимает последние две цифры года и дополняет левую часть нулями до максимум 2 символов. Выглядит как «на всякий случай» для лет с истечением срока действия, заканчивающихся на 08, 07 и т. Д., Обеспечивая наличие ведущего нуля.

1 голос
/ 20 сентября 2008

что-то глупое. Он получает значение выбранного элемента и получает все после первых двух символов. Если это только один символ, то он добавляет «0» к его началу, а если это ноль символов, он возвращает «00». Причина, по которой я говорю, что это глупо, заключается в том, что если вам нужно, чтобы значение было длиной в два символа, почему бы просто не установить его так, чтобы оно начиналось при создании раскрывающегося списка?

1 голос
/ 20 сентября 2008

Конечно, вы можете запустить это. Вы просто не можете запустить его в отлаживаемом приложении. Чтобы узнать, что он делает, а не только то, как он выглядит, создайте новое веб-приложение, вставьте DropDownList, добавьте несколько статических лет, а затем вставьте код, который вы упомянули, и посмотрите, что оно делает. Тогда ты точно будешь знать.

0 голосов
/ 10 июля 2012

Этот код пытается получить год из двух цифр из года, состоящего из четырех цифр (подсказка ddlexpyear)

Он принимает строки и возвращает строки, поэтому я буду избегать разделителей строк:

  • 1998 -> 98
  • 2000 -> 00
  • 2001 -> 01
  • 2012 -> 12

Проблема в том, что это плохо работает. В этих случаях отступы на самом деле не помогают. Удаление кода пэда не влияет на правильные случаи.

Таким образом, код работает (с или без пэда) в течение четырехзначных лет, что он делает для строк другой длины?

  • ноль: исключение
  • 0: исключение
  • 1: исключение
  • 2: всегда возвращает «00». например 49 год (когда евреи были изгнаны из Рима) становится "00". Это плохо.
  • 3: сохраняет последнюю цифру и ставит перед ней «0». Исправить в 10% случаев (когда вторая цифра на самом деле является нулем, например, 304 или 908), но в остальных - совсем неправильно (например, 915, 423 и 110)
  • 5: просто сохраняет 3-ю и 4-ю цифры, что также неверно, «10549», вероятно, должно быть «49», но вместо «54».
  • как и следовало ожидать, проблема сохраняется в старших цифрах.
0 голосов
/ 20 сентября 2008

PadLeft что-то делает, только если пользователь вводит год длиной 2 или 3 цифры.

Если год состоит из 1 цифры, вы получаете исключение (ошибка подсистемы).

Если год состоит из 2 цифр (07, 08 и т. Д.), Он вернет 00. Я бы сказал, что это ошибка.

Если год состоит из трех цифр (207, 208), которые автор мог предположить опечатками, он вернет последнюю цифру с добавлением нуля - 207 -> 07; 208 -> 08.

Пока пользователь должен выбрать год и ему не разрешено вводить год, PadLeft не нужен - подстрока (2) делает именно то, что вам нужно, учитывая год из 4 цифр.

0 голосов
/ 20 сентября 2008

Подстрока возвращает значение с пропущенными первыми двумя символами, лопатка дополняет результат начальными нулями:

 string s = "2014";
    MessageBox.Show(s.Substring(2).PadLeft(2, 'x')); //14
    string s2 = "14";
    MessageBox.Show(s2.Substring(2).PadLeft(2, 'x')); //xx

Полагаю, код пытается преобразовать год в двузначное значение.

0 голосов
/ 20 сентября 2008

PadLeft гарантирует, что вы получите по крайней мере два символа от ввода, дополняя ввод (слева) соответствующим символом. Таким образом, ввод, в этом случае, может быть 12. Вы получите «12» обратно. Или ввод может быть 9, в этом случае вы получите «09» обратно.

Это пример сложной цепочки (см. "Есть ли какая-то выгода в цепочке" пост), которая пошла не так, и код кажется слишком сложным.

0 голосов
/ 20 сентября 2008

Он принимает последние две цифры года, затем дополняет левую часть цифрой «0».

Так что 2010 будет 10, 2009 будет 09.

Не уверен, почему разработчик не просто установил значение в раскрывающемся списке до двух последних цифр, или почему вам нужно будет оставить его слева (если вы не имели дело с годами 0-9 нашей эры).

0 голосов
/ 20 сентября 2008

ОК, так что он берет значение из выпадающего списка, ABCD

Затем она берет подстроку из позиции 2, CD

А потом он ошибается, оставляя дополнить его двумя нулями, если это тоже нужно, CD

Или, если вы только что завершили X, тогда будет подстрока к X и заполнитель к OX

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...