Не могу понять, что делает эта подстрока.PadLeft

StackOverflow https://stackoverflow.com/questions/105724

  •  01-07-2019
  •  | 
  •  

Вопрос

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

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

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

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

Это было полезно?

Решение

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

Другие советы

При этом на консоль выводится "98".

class Program
{
    static void Main(string[] args)
    {
        Console.Write("1998".Substring(2).PadLeft(2, '0'));
        Console.Read();
    }
}

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

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

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

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

Это пример сложной цепочки (см. "Есть ли какая-то польза в Объединении в Цепочку" post) пошло наперекосяк, и код стал казаться чрезмерно сложным.

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

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

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

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

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

При двухзначном годе (07, 08 и т.д.) он вернет значение 00.Я бы сказал, что это ошибка.

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

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

Этот код, похоже, пытается получить 2-значный год из четырехзначного года (подсказка - ddlexpyear)

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

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

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

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

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

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

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

И тогда он ошибается, left дополняет его 2 нулями, если ему тоже нужно, CD

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

В нем записываются последние две цифры года, затем слева ставится "0".

Таким образом, 2010 год был бы 10-м, 2009-й - 09-м.

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top