Pregunta

En este código que estoy depurando, tengo este fragmento de código:

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

¿Qué devuelve esto?Realmente no puedo ejecutar esto demasiado ya que es parte de una aplicación de tarjeta de crédito activa.DropDownList, como se puede imaginar por el nombre, contiene el año de 4 dígitos.

ACTUALIZAR:Gracias a todos.No desarrollo mucho .NET, por lo que configurar una prueba rápida no es tan rápido para mí.

¿Fue útil?

Solución

Toma los dos últimos dígitos del año y rellena el lado izquierdo con ceros hasta un máximo de 2 caracteres.Parece un "por si acaso" para los años de vencimiento que terminan en 08, 07, etc., asegurándose de que el cero inicial esté presente.

Otros consejos

Esto imprime "98" en la consola.

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

Por supuesto que puedes ejecutar esto.Simplemente no puedes ejecutarlo en la aplicación que estás depurando.Para saber qué está haciendo, y no solo lo que parece que está haciendo, cree una nueva aplicación web, coloque una DropDownList, agregue algunos años estáticos y luego ingrese el código que mencionó y vea qué hace.Entonces lo sabrás con seguridad.

algo estúpido.Se obtiene el valor del elemento seleccionado y se toma todo lo que hay después de los dos primeros caracteres.Si es solo un carácter, agrega un '0' al principio, y si tiene cero caracteres, devuelve '00'.La razón por la que digo que esto es estúpido es porque si necesita que el valor tenga dos caracteres, ¿por qué no configurarlo así para empezar cuando crea la lista desplegable?

Parece que está tomando la subcadena desde el tercer carácter (si está basado en 0) hasta el final, luego, si la subcadena tiene una longitud menor que 2, hace que la longitud sea igual a 2 agregando 0 al lado izquierdo.

PadLeft garantiza que reciba al menos dos caracteres de la entrada, rellenando la entrada (en el lado izquierdo) con el carácter apropiado.Entonces la entrada, en este caso, podría ser 12.Obtienes "12" de vuelta.O la entrada podría ser 9, en cuyo caso obtendrá "09".

Este es un ejemplo de encadenamiento complejo (ver "¿Hay algún beneficio en el encadenamiento?" post) salió mal y hizo que el código pareciera demasiado complejo.

La subcadena devuelve el valor con los dos primeros caracteres omitidos, el padleft rellena el resultado con ceros a la izquierda:

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

Supongo que el código está intentando convertir el año a un valor de 2 dígitos.

PadLeft solo hace algo si el usuario ingresa un año que tiene 2 o 3 dígitos.

Con un año de 1 dígito, obtienes una excepción (Subsring errs).

Con un año de 2 dígitos (07, 08, etc), devolverá 00.Yo diría que esto es un error.

Con un año de 3 dígitos (207, 208), que el autor pudo haber asumido como errores tipográficos, devolvería el último dígito rellenado con un cero: 207 -> 07;208 -> 08.

Siempre que el usuario deba elegir un año y no se le permita ingresar un año, PadLeft es innecesario: Substring(2) hace exactamente lo que necesita dado un año de 4 dígitos.

Este código parece estar intentando tomar un año de 2 dígitos de un año de cuatro dígitos (ddlexyear es la pista)

Toma cadenas y devuelve cadenas, por lo que evitaré los delimitadores de cadenas:

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

El problema es que no hace un buen trabajo.En estos casos, el acolchado realmente no ayuda.Eliminar el código del pad no afecta los casos en los que se corrige.

Entonces, el código funciona (con o sin pad) para años de 4 dígitos, ¿qué hace para cadenas de otras longitudes?

  • nulo:excepción
  • 0:excepción
  • 1:excepción
  • 2:siempre devuelve "00".p.ej.el año 49 (cuando los judíos fueron expulsados ​​de roma) se convierte en "00".Esto es malo.
  • 3:guarda el último dígito y pone un "0" delante de él.Correcto en el 10% de los casos (cuando el segundo dígito es en realidad un cero, como 304 o 908), pero bastante incorrecto en el resto (como 915, 423 y 110).
  • 5:simplemente guarda el tercer y cuarto dígito, lo cual también es incorrecto, "10549" probablemente debería ser "49" pero en su lugar es "54".
  • Como es de esperar, el problema continúa en dígitos más altos.

Bien, entonces está tomando el valor del menú desplegable, ABCD.

Luego toma la subcadena de la posición 2, CD

Y luego se equivoca, lo rellena con 2 ceros si es necesario también, CD

O, si acaba de terminar X, entonces sería una subcadena a X y un relleno a OX

Se toman los dos últimos dígitos del año y luego se rellena hacia la izquierda con un "0".

Entonces 2010 sería 10, 2009 sería 09.

No estoy seguro de por qué el desarrollador no simplemente estableció el valor en el menú desplegable en los dos últimos dígitos, o por qué necesitaría rellenarlo a la izquierda (a menos que estuviera tratando con los años 0-9 d.C.).

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top