Pergunta

Neste código que estou a depuração, eu tenho essa snipit código:

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

O que esse retorno? Eu realmente não pode executar este muito, pois é parte de um pedido de cartão de crédito ao vivo. O DropDownList como você poderia imaginar a partir do nome contém o ano de 4 dígitos.

UPDATE: Obrigado a todos. Eu não faço um monte de desenvolvimento .NET assim a criação de um teste rápido não é tão rápido para mim.

Foi útil?

Solução

É preciso os dois últimos dígitos do ano e almofadas no lado esquerdo com zeros para um máximo de 2 caracteres. Parece um "just in case" para os anos de validade termina em 08, 07, etc., certificando-se que o zero está presente.

Outras dicas

Isto imprime "98" para o console.

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

Claro que você pode executar este. Você simplesmente não pode executá-lo no aplicativo que você está depurando. Para saber o que está fazendo, e não apenas o que parece que ele está fazendo, fazer uma nova aplicação web, colocar em um DropDownList, coloque alguns anos estáticos na mesma, e em seguida, colocar no código que você mencionou e ver o que faz. Então você vai saber ao certo.

algo estúpido. Está ficando o valor do item selecionado e tomando a tudo após os dois primeiros caracteres. Se isso é apenas um personagem, então ele adiciona um '0' para o início do mesmo, e se for zero caracteres, a ele retorna '00'. A razão de eu dizer isso é estúpido é porque se você precisa que o valor seja dois caracteres, porque não basta defini-lo como aquele para começar quando você está criando na lista suspensa?

Parece que ele está agarrando a substring a partir do 3º personagem (se 0 com base) até o fim, então, se a substring tem um comprimento inferior a 2 está fazendo o comprimento igual a 2, adicionando 0 para o lado esquerdo.

PadLeft garante que você receba pelo menos dois caracteres a partir da entrada, acolchoar a entrada (no lado esquerdo) com o personagem apropriado. Então entrada, neste caso, pode ser 12. Você ganha "12" de volta. Ou de entrada pode estar 9, caso em que, você tem "09" de volta.

Este é um exemplo de encadeamento complexo (ver "há algum benefício em encadeamento" post ) mal se foi, e tornar o código aparecer excessivamente complexa.

Os retornos subseqüência o valor com os dois primeiros caracteres ignorados, as almofadas PadLeft o resultado com zeros à esquerda:

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

O meu palpite é que o código está tentando converter o ano para um valor de 2 dígitos.

O PadLeft só faz alguma coisa, se o usuário digita um ano que seja 2 ou 3 dígitos.

Com um ano de 1 dígito, você recebe uma exceção (Subsring ERRs).

Com um ano de 2 dígitos (07, 08, etc), ele retornará 00. Eu diria que este é um erro.

Com um ano de 3 dígitos (207, 208), que o autor pode ter assumido como erros de digitação, ele retornaria o último dígito acolchoado com um zero - 207 -> 07; 208 -.> 08

Enquanto o usuário deve escolher um ano e não é permitida a entrada de um ano, o PadLeft é desnecessário -. A Substring (2) faz exatamente o que você precisa dado um ano de 4 dígitos

Este código parece estar a tentar agarrar um ano de 2 dígitos a partir de um ano de quatro dígitos (ddlexpyear é a dica)

É preciso strings e retorna cordas, por isso vou evitar os delimitadores de strings:

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

O problema é que ele não faz um bom trabalho. Nestes casos, o preenchimento não realmente ajudar. Removendo o código pad não afeta os casos torna-se correta.

Assim, o código funciona (com ou sem a almofada) para 4 anos dígito, o que ele faz para cordas de outros comprimentos?

  • nulo: exceção
  • 0: exceção
  • 1: exceção
  • 2: sempre retorna "00". por exemplo. o ano 49 (quando os judeus foram expulsos de Roma) torna-se "00". Isso é ruim.
  • 3: salva o último dígito, e coloca um "0" na frente dele. Correcta em 10% dos casos (quando o segundo dígito é realmente um zero, como 304, ou 908), mas completamente errado no restante (como 915, 423, e 110)
  • . 5: apenas salva o 3º e 4º dígitos, o que também é errado, "10549" provavelmente deve ser "49", mas em vez disso é "54"
  • como você pode esperar que o problema continua em dígitos mais elevados.

OK por isso está tomando o valor do baixo gota, ABCD

Em seguida, ele toma a substring da posição 2, CD

E, em seguida, err, almofadas deixou com 2 zeros se ele precisa também, CD

Ou, se você acabou de acabou X, então seria substring de X e almofada para OX

Está tomando os dois últimos dígitos do ano, então pad à esquerda com um "0".

Assim, 2010 seria 10, 2009 seria 09.

Não sei por que o desenvolvedor não apenas definir o valor na lista suspensa para os dois últimos dígitos, ou por que você precisa para preencher esquerda (a menos que você estivesse lidando com anos 0-9 AD).

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top