22/10/2008 21:32 El Bruno

[NET] Sobre fechas y números que se dan vuelta, o que cambian el punto por la coma

Buenas,

cada tanto recuerdo mis primeros días en la informática allá por el 1999, cuando descubría el placer de Visual Basic 6, ASP, los componentes COM+, SQL Server, etc. En esos días, mi trabajo era 100% developer en un producto de Workflow, y recuerdo cuando con Suin y el Iteya, uno programaba las paginas ASP, otro los componentes COM+ y yo lo enganchaba al Workflow. Después de noches eternas tirando líneas y líneas (donde una coca cola con café era el alimento indispensable) muchas cosas me quedaron bastante claras, entre ellas que las fechas se deben tratar con tipos de dato DateTime y lo mismo aplica para los números.

Hoy 9 años después, a los 3 la vida nos llevó por diferentes caminos; uno es dueño de una empresa con un producto impresionante (pocas veces vi algo tan groso con WF), otro lidera un equipo de desarrollo en una empresa que no puedo nombrar (porque es muy grande) y yo ... bueno yo escribo en www.elBruno.com.

Sin embargo, creo que a los 3 las siguientes frases nos ponen de muy mal humor:

- se me dio vuelta la fecha

- el número no me toma la coma, solo funciona con puntos

Me parece increíble que actualmente (año 2008 para futuras referencias) todavía existan personas que no se tomen 30 minutos para leer como funcionan las Cultures de .Net o que piensen que la mejor forma de escribir una función para validar un número es la siguiente:

private bool IsNumeric(string text) { return System.Text.RegularExpressions.Regex.IsMatch(text, @"^\d+(\.\d+)?$"); }

Como sé que es una misión imposible, y que la gente seguirá por el mal camino; para todos aquellos que seguirán tratando a las fechas y a los números con strings, tengo 3 consejos:

1. En primer lugar informar/taladrar/advertir/notificar que la coma no es el único carácter para separar decimales, y que en algunos países, por cuestiones muy extrañas, la fecha puede tener un formato del tipo: mes/día/año (esto no se debe a cuestiones místicas relacionadas con la posición de los planetas, ni tampoco la solución consiste en degollar un gallo virgen y derramar su sangre un martes 13 sobre un ordenador amarillo; las cosas simplemente son así)

2. Por favor, no complicarse la vida con funciones extrañas para averiguar cuál es el carácter para separar decimales.

A esa excelente idea que consiste en dividir un número por dos, guardarlo en un string y buscar el 2do carácter; se la puede reemplazar por el uso de la biblioteca NumberFormat y averiguar muchas cosas más con menos. Por ejemplo para averiguar el separador de decimales, o el signo para los número negativos es posible utilizar el siguiente código:

NumberFormatInfo numberFormatInfo = System.Globalization.CultureInfo.CurrentCulture.NumberFormat; string decimalSeparator = numberFormatInfo.NumberDecimalSeparator; string groupSeparator = numberFormatInfo.NumberGroupSeparator; string negativeSign = numberFormatInfo.NegativeSign;

3. Finalmente, si alguna vez nos cruzamos en un proyecto y tienes alguna "excusa" para utilizar strings, por favor dímelo. Después de 9 años, sigo escuchando las cosas más inverosímiles que me sorprenden y me alegran el día.

 

Saludos @ Home

El Bruno

Crossposting from ElBruno.com
Archivado en: ,
Comparte este post:

# re: [NET] Sobre fechas y números que se dan vuelta, o que cambian el punto por la coma

Wednesday, October 22, 2008 10:32 PM by Romny

Hola bruno, pues si, hay cosas de cosas, pero eso de numeros y fechas es tipo en los comienzos de un desarrollador. Pero lo bueno es que hay herramientas que solucionan esto de la forma mas facil, que hay, o bueno eso pienso.

# re: [NET] Sobre fechas y números que se dan vuelta, o que cambian el punto por la coma

Wednesday, October 22, 2008 11:37 PM by Alfredo

Y para las horas, que recomiendas?

Un saludo!

# re: [NET] Sobre fechas y números que se dan vuelta, o que cambian el punto por la coma

Wednesday, October 22, 2008 11:48 PM by Sergio Tarrillo

Te va dar mucha lata tener una fecha como string, lo mejor es usar tipo de dato fecha y dejarle a .Net y Sql que hagan el trabajillo.

Pero antes de que tu información este en un tipo de dato .Net, es un string en una caja de texto, salvo que uses un control de selección y no dejes que el usuario use el teclado. Y el problemilla viene en pasar ese String a tipo de DateTime de .Net (ya el se encarga de pasar el dato como datetime a SQL).

O haces que tu sistema soporte varios formatos (vas a tener que trabajar con el formato de la PC), o la más fácil sólo soportas un formato y le dices al usuario este "es mi formato".

El problema del primero escenario es que si bien tu quieres ingresar un tipo moneda en español, tienes que saber que tu configuración regional también debe estar en español y no en otro idioma (podría estar en inglés), y este detallito lo deberían tener en cuenta los users si dejamos que la aplicación soporte multiples formatos usando la configuración de la PC.

Buen tema!

Saludos,

# re: [NET] Sobre fechas y números que se dan vuelta, o que cambian el punto por la coma

Thursday, October 23, 2008 6:40 AM by Jersson

Hola Bruno, solo para decirte que este post me parece demasiado bueno, claro, he recordardo a muchos de mis amigos que comentan como es que podian hacer muchas cosas, pero que, si se trataba de fechas, mejor se lo dejaban a otros!

Un Saludo.

# re: [NET] Sobre fechas y números que se dan vuelta, o que cambian el punto por la coma

Thursday, October 23, 2008 9:51 AM by Pablo Alarcon Garcia

Totalmente de acuerdo, impresionante como se complican algunos a reinventar la rueda( y encima la hacen cuadrada y se rompe al poco ).

Eso sí, este tema está sin completar sin continuar con los problemas comunes de usar clases sensitivas a la cultura actual.

Por ejemplo:

Leer una fecha de un fichero de configuración, y convertirla a DateTime sin especificar una cultura, con lo que el valor de la fecha variará según la configuración regional del ordenador donde se ejecute. Típico desarrollar en un Windows en Castellano y correr en un servidor en Inglés: cambiando meses por días o cascando por no ser válido al leerse.

El mismo problema es extensible a la gente que formatea manualmente las fechas de una query a base de datos en vez de parametrizarlas y que sea el proveedor de acceso a la BD el que la formatee teniendo en cuenta la configuración de fechas de la BD.

Hay un sinfín de casos típicos, no recuerdo qué CTP de Microsoft recién liberada casca en aquellos países donde el separador de decimales no es el '.' .

# re: [NET] Sobre fechas y números que se dan vuelta, o que cambian el punto por la coma

Thursday, October 23, 2008 10:08 PM by Juan Irigoyen

Pues a mí lo que me pone de muy mal talante..., es la prepotencia que tienen algunos con frases como: “me pone de mal humor se me dio vuelta la fecha... que existan personas que no se tomen 30 minutos", y que, que pasa, que tu eres perfecto y te has leído toda la documentación de visual studio y claro tienes que demostrarlo con un gran Post como "este" poniendo verde a la gente que no tiene tus conocimientos, o que por un motivo o otro no conozca las culturas de .net, venga, que de listos esta el mundo lleno...

# re: [NET] Sobre fechas y números que se dan vuelta, o que cambian el punto por la coma

Friday, October 24, 2008 12:03 AM by El Bruno

@Romny, tienes razón eso suele aprenderse en los primeros proyectos.

@Alfredo, para las horas?? pues un string jejeje

@Sergio, pues también tienes toda la razón, no podemos "forzar" este tipo de cosas. Además si .Net y SQL tienen tipos de datos especiales para estos escenarios, mejor aprovecharlos :D

@Jerson ;) jeje

@Pablo, has captado la esencia del post; muchas personas se dedican a reinventar la rueda, y eso suele causar problemas de los mas graves. No conozco la CTP que comentas, pero creo recordar una de SQL Server 2008 que no funcionó este año el 29 de febrero !!! es lo que tienen los años bisiestos.

@Juan, lamento si el post te puso de mal humor, siempre tienes la oportunidad de opinar y te agradezco que lo hayas hecho. Si me preguntas si conozco toda la MSDN, obviamente que la respuesta es NO; pero si te diría que antes de hacer cualquier tipo de trabajo trato de formarme un poco para no caminar sobre vacío. En ningún momento "pongo verde" a nadie en particular, aunque si con el post logro que alguien se piense las cosas 2 veces antes de hacerlo me quedo contento.

En realidad, creo que el problema más grave, suele estar en la gente que realiza algún tipo de cosas del estilo de "reinventar la rueda" y se justifica con errores del tipo "es que el framework está mal", o "de esta forma funciona siempre". Yo soy el developer más vago del mundo y siempre trato de aprovechar todo lo que ya existe. Y que mejor lugar o herramienta para este tipo de cosas, que aprovechar toda la potencia del .Net Framework..

Saludos

# re: [NET] Sobre fechas y números que se dan vuelta, o que cambian el punto por la coma

Friday, October 24, 2008 10:49 AM by Juan Irigoyen

Si, pero debes entender que muchas de las personas como tu y otros que escriben en este blog sois alumnos aventajatados,

como tal debeis tener "paciencia" con otra gente, que no conoce, por las circunstancias que sean esta información, estaras

deacuerdo en que practicamente todos los dias en que se programa se aprende algo nuevo, yo veo muchos errores de este tipo en las

aplicaciones debido al desconocimiento del framework, pero yo mismo me doy cuenta cuando veo mi código escrito meses atras

de cosas que deberia haber hecho mejor por no conocer aspectos del framework, precisamente la semana pasada descubri la función 'PadLeft',

y me di cuenta de que habia desarrollado un buble con unas cuantas lineas de código para hacer lo mismo que esta función,

creo que es normal que mucha gente desconozca las culturas en .net y muchos otros

aspectos ya que el número de clases y la complejidad del desarrollo en estos últimos años a aumentado de forma exponencial y

debeis tener una actitud diferente con aquella gente que por los motivos que sean no tiene vuestras cualidades ni conocimientos e  interes.

De todas formas es una opinión critica para que la tengas en cuenta.

# re: [NET] Sobre fechas y números que se dan vuelta, o que cambian el punto por la coma

Tuesday, October 28, 2008 9:20 PM by Ariel Schwindt

Brunito, querido! jejejejej, me hiciste reir mucho con este post. Es cierto, a mi tambien esas preguntas me ponen de mal humor.

De mas esta decir que no es porque seamos unos genios iluminados ni porque tengamos la capacidad de memorizar cientos de paginas de documentacion, sino porque son cuestiones básicas (creo) que deberian formar parte indispensable del bagage de conocimientos de un programador post-junior.

Aparte...10 años atras vaya y pase..pero ahora, con Google y la miríada de informacion disponible y al alcance de un click que hay...vamos!!! Pero está muy bueno que lo resumas, hacele un update para el caso (muy comun) en el que hay que pasar una fecha dentro de un XML , ahi tenes un caso en el que te van a decir que usan string porque lo tienen que guardar en un XML.

un abrazo de este lado del charco.