Informática e Internet

Uso de tipos Nullable<> con el operador ternario

La introducción en la plataforma .NET de los tipos Nullable<> nos facilitó bastante la vida al evitarnos a los desarrolladores el engorro de tener que definir un valor para los tipos valor numéricos que hiciera las veces de nulo.

Pero hay ocasiones en los que el uso de los tipos Nullable<> no está del todo claro, y uno de estos casos es su empleo dentro de operaciones en las que se involucra al operador ternario. Imaginemos la siguiente operación…

int? entero = (obj1.Codigo > obj2.Codigo) ? null : 1;

A priori parece correcta, pero el compilador nos informará de que se ha producido un error en tiempo de diseño. Esto ya nos da una pista del posible error que estamos cometiendo. Recordemos que los tipo Nullable<> son genéricos, por lo que el compilador chequea que todo lo que se usa con el tipo definido como Nullable<> sea de su mismo tipo.

En este caso vemos que la operación asigna dos posibles valores, 1, que es un valor del tipo Int32 y null. Pero entonces… ¿dónde está el error? Pues aunque no lo parezca el error de tipo se encuentra en el null. Para que el operador ternario acepte la operación tenemos que hacer un casting al valor null, de tal manera que si la operación se escribe de esta manera…

int? entero = (obj1.Codigo > obj2.Codigo) ? (int?) null : 1;

…funcionará correctamente en tiempo de diseño y ejecución.

Cajón desastre

Barrio Sésamo cumple 40 años

40º Aniversario de Barrio Sésamo

Imagen conmemorativa de Google por el 40ª aniversario

El programa que acompañaba a los niños de mi generación a la hora de la merienda celebra hoy su cuarenta aniversario.

¡Qué tiempos aquellos! Al ver la imagen de Google han venido a mi memoria los Nabuconodosorcitos, esos pequeños seres que vivían la maceta de la casa de Epi y Blas, que eran mis personajes preferidos.

Y a las generaciones posteriores a la mía que quieran saber cómo pasábamos las tardes cuando no había consolas y sólo teníamos dos canales de televisión les invito a leer este artículo de la Wikipedia sobre Barrio Sésamo.

¡¡Felicidades!!

Informática e Internet

Obtener CultureInfo a partir de la propiedad Page.Culture

Una parte importante de las aplicaciones web y que casi nunca se tiene en cuenta es la referente a la presentación de la información basándose en la configuración regional del usuario.

En ASP.NET tenemos medios y técnica que nos facilitan todas las tareas referentes a la globalización, pero el problema surge cuando no es difícil establecer la configuración regional de nuestro usuario. Veamos cómo se puede llegar a este escenario.

La inmensa mayoría de los navegadores, por no decir todos, permiten al usuario establecer los idiomas en los que prefiere ver una página en caso de que haya varios idiomas para elegir. Si el usuario ha creado una lista de estos idiomas nosotros como desarrolladores no tendremos problemas a la hora de establecer la configuración regional que emplearemos para validar los datos que el usuario nos proporcione. Para ellos basta con implementar el siguiente código

if(Request.UserLanguages != null) {
CultureInfo provider = CultureInfo.CreateSpecificCulture(Request.UserLanguages[0]);

}

La razón por la que empleo el método CreateSpecificCulture es que para poder validar datos con algún tipo de formato (números, fechas, etc) necesitamos una cultura de tipo específico, es decir, que indique el país y la región, como por ejemplo (es-es). Las culturas llamadas neutrales sólo hacen referencia al país omitiendo cualquier referencia a una región, que sería el caso de (es)

De esta manera ya podría usar el método TryParse a la hora de recoger el valor esperado. De esta forma permitimos al usuario que introduzca información pudiendo emplear la notación numérica o de fechas de su país. Veamos un ejemplo de uso del método TryParse:

NumberStyles estilo = NumberStyles.Number;
IFormatProvider provider = null;

if(Request.UserLanguages == null) {
provider = CultureInfo.CreateSpecificCulture(Request.UserLanguages[0]);

}

double valor;

bool valor_ok = Double.TryParse(this.TextBox.Text, estilo, provider, out cobertura);

Se le pasa como parámetros el string que queremos convertir, el estilo numérico que esperamos encontrar, en este caso es para números de todo tipo, la referencia cultural que debemos emplear a la hora de parsear la cadena y una variables donde dejar el resultado de la operación de parseo

Devuelve un bool que nos indica si la operación de parseo ha finalizado con éxito o si por el contrario ha habido algún error.

Pero ¿y si el usuario no ha especificado una lista de idiomas en su navegador? En este caso la solución es un poco más laboriosa.

Para empezar no podremos usar la propiedad UserLanguages de la clase HttpRequest ya que en este caso el array es nulo, y si recuperamos el valor de la propiedad Culture de la páginas ASP.NET veremos que el nombre que nos da, por ejemplo Español (España) no podemos usarlo ni en el constructor ni en ninguno de los método estáticos de la clase CultureInfo, así que, cómo podemos recuperar un objeto de la clase CultureInfo cuando sabemos que configuración emplea nuestro usuario pero a priori no tenemos nada para poder recuperarla.

Lo primero que tenemos que hacer es recuperar todas las culturas disponibles usando el método estático GetCultures de la clase CultureInfo. Una vez que tenemos esto tendremos que buscar una cuya propiedad DisplayName coincida con el valor que se encuentra en la propiedad Culture de nuestra página ASP.NET, y para ayudarnos en la labor de búsqueda nos apoyaremos en LINQ. Vamos a ver como queda todo esto junto.

public static CultureInfo ObtenerCultura(string displayName) {
CultureInfo cultura = null;
CultureInfo[] culturas = CultureInfo.GetCultures(CultureTypes.AllCultures);

try {
cultura = (from c in culturas
where c.DisplayName == displayName
select c).First<CultureInfo>();
} catch(Exception) {
cultura = CultureInfo.InvariantCulture;
}

return cultura;
}

Como vemos en caso que no encuentre la configuración regional del usuario entre las disponibles en el servidor devolveremos la InvariantCulture, disponible en todos los sistemas y que deriva de la configuración inglesa.

Cajón desastre

Vacunación contra la gripe a los profesores

Hace un par de días que la ministra de sanidad, Trinidad Jiménez, anunció los planes de su ministerio para vacunar contra el virus de la gripe A/H1N1 a los diferentes grupos de riesgos, así como al personal sanitario.

Lo que me llamó la atención es la intención de vacunar a los profesores. ¿Por qué?, qué tiene de especial este colectivo que les haga acreedores de una vacuna.

Creo que es una medida populista para tranquilizar a los padres, pero en cuanto te pones a pensar en la medida esta hace aguas por todos los sitios. Veamos porque.

Prevención del contagio desde el profesor a los alumnos

Si se hace para proteger a los niños no es necesario ya que los niños de entre 0 y 14 años son considerados un grupo de riesgo y serán vacunados. Por lo que si el profesor se contagia el único que enfermará de toda la clase será él.

Dentro de un colegio hay más personal además de los profesores, a bote pronto los conserjes y el personal de secretaría, que no entran dentro del personal de riesgo por lo que no serán vacunados. Y si el niño va en autocar al colegio los conductores son un colectivo que tampoco lo serán.

Es decir, que dentro del ámbito escolar los niños conviven con más gente además de los profesores. Y a la inversa, esos colectivos también conviene con los niños al igual que los profesores.

Para prevenir que el profesor propague la enfermedad entre diferentes clases.

No vale de nada. Hasta donde yo recuerdo los alumnos comparte lugares de recreo e instalaciones y a la hora de la salida salen todos juntos en tropel.

Y si…

Recordemos que los niños serán vacunados hasta los 14 años, y supongamos que al final se vacuna a los profesores. Así es presumible que los alumnos hasta 14 años estarán libres de la gripe. Pues no.

Imaginemos una clase con alumnos de 14 años. En dicha clase hay un repetidor, por lo que su edad es de 15 años, edad a la que se considera que no pertenece a un grupo de riesgo y por lo tanto no estarán vacunados.

No digo que los profesores no merezcan ser vacunados, en absolutos, tienen el mismo derecho que el resto de la población, pero no creo que sean un colectivo de riesgo, o que su importancia les convierta en imprescindibles para el día a día.

Particularmente pienso que este tipo de discusiones se acabarían si el gobierno hubiera comprado vacunas para toda la población como han hecho los gobiernos de Francia y del Reino Unido y no sólo para el 40%.

Artículos relacionados.