Programación

Overflow scroll fluido para safari mobile

Algunos desarrolladores que hacemos webs para dispositivos móviles como puede ser un iPhone o un iPad, a veces nos encontramos con un gran problema y es que si queremos hacer un scroll horizontal funciona pero no queda muy fluido. Supongamos que tenemos una pequeña página y a modo de appstore, queremos tener un cuadro que tenga varias capturas de pantalla o imágenes y que entre las imágenes, hemos hecho un scroll. Si probamos esto en un iPad o un iPhone, veremos como el scroll no es muy fluido, va como a tropezones, pero la solución es bien fácil, solo hay que cambiar un pequeño estilo de CSS.

Para solucionar esto podemos utilizar -webkit-overflow-scrolling: touch; para indicarle a safari mobile que queremos hacer un scroll con el dedo y de esta forma, el scroll ira fluido y no se trabará.

Os dejo un ejemplo de como quedaría:

Mobile test

Video sobre el jQueryIO acerca de buenas practicas con jQuery

El otro día tuve la suerte de estar en el jQueryIO junto a Miguel Angel Alvarez de desarrolloweb.com y Quique Fernández. Hicimos una pequeña charla hablando un poco sobre buenas practicas a la hora de trabajar con jQuery y como mejorar el rendimiento de nuestras aplicaciones web.

Una parte de lo que se habló, esta publicada en la web en algunos artículos como: Guía de buenas prácticas para aumentar el rendimiento de jQuery o Selectores dobles con JQuery, aumentando el rendimiento de JQuery

Os dejo el video de la charla para quien quiera echarle un vistazo y deje sus opiniones:

Introducción a RaphaelJS

RaphaelJS es una librería de javascript para desarrollar gráficos y animaciones vectoriales en SVG y VML. ¿Qué es SVG? ¿Por qué vamos a utilizar gráficos vectoriales? ¿Para qué utilizar una librería para trabajar con SVG? Todas estas preguntas son las que debemos comprender antes de empezar a trabajar.

Gráficos Vectoriales Escalables o abreviado del ingles SVG (Scalable Vector Graphics) es un estandar propuesto en el año 2001 por el W3C para estandarizar los gráficos vectoriales. Allá por el año 1998, se presentaron 2 propuestas de gráficos vectoriales, por un lado se presento PGML por parte de Adobe, IBM, Netscape (Mozilla y Firefox) y Sun (Java, ahora parte de Oracle). Por otra parte se presento VML que tuvo más éxito por parte de Autodesk (creadores de Autocad), Macromedia (creadores de flash y posteriormente comprado por Adobe) y Microsoft. Normalmente cuando se hacen varias propuestas de este estilo al W3C, se acaba decantando por una en particular, pero en este caso, se optó por el camino del medio y el W3C propuso SVG que no es mas que la mezcla de VML + PGML.

Con SVG se crea un documento XML que puede ser utilizado tanto en un archivo independiente con extension *.SVG como embebido dentro de una página web al ser un XML y puede ser manipulado con javascriptSVG tiene su propio árbol DOM similar al HTML por lo que fácilmente desde javascript podremos capturar eventos, cambiar sus caracteristicas, así como dar estilos desde CSS.

Una vez tenemos la base, podemos entender mejor el papel de RaphaelJS en todo esto. RaphaelJS es una librería que nos promueve de una gran cantidad de objetos y métodos para encapsular los documentos SVG. Esta necesidad vino dada en su dia por los navegadores antiguos que interpretaban VML y los mas modernos que fueron interpretando SVGRaphaelJS genera los documentos dinámicamente en uno u otro lenguaje, dependiendo de lo que soporte el navegador, siempre dando prioridad al estandar SVG.

Si todos los navegadores actuales soportan SVG ¿Por qué utilizar una librería como RaphaelJS y no SVG nativo? Muy sencillo y es que cuando queremos generar unos gráficos en SVG dinámicamente, con animaciones y demás, necesitamos de un respaldo de utilidades que nos faciliten en todo lo posible el trabajo, ya que el objetivo es ser productivos. Por ejemplo, para quienes conozcan jQuery, todo el mundo sabe hacer un document.getElementById, pero siempre acabamos haciendo $(«#id») porque es más cómodo, ademas de ofrecernos herramientas muy útiles. Con RaphaelJS pasa lo mismo, si queremos generar una animación en SVG, nos ofrece funciones con calbacks para generar animaciones dinámicamente con varias funciones easing o podemos guardar los objetos de SVG según los vayamos creando para reutilizarlos mas adelante, ademas de ser un poco mas sencillo de utilizar que SVG a pelo.

Este contenido y mas ira apareciendo en el curso de Raphael JS – Gráficos vectoriales con javascript y mas en concreto en el primer capítuo: Introducción a RaphaelJS.

Placeholder en los input con HTML5 y como darles estilo a los placeholder de los input desde css3

Una gran mejora enfocada a formularios que trae de la mano HTML5 y CSS3 es el uso de placeholder. Para quien no lo conozca, un placeholder es ese texto que aparece por defecto en un campo de texto y que en el momento que empezamos a escribir desaparece. Se suelen utilizar en formularios con un texto «escriba aquí su nombre» o «su búsqueda», etc. y con el uso de javascript, se ocultaba el texto al empezar  a escribir. Con la aparición de HTML5, los navegadores empezaron a implementar esta nueva funcionalidad.

Utilizar un placeholder no tiene misterios ni secretos y se pueden utilizar tanto para las cajas de texto como las contraseñas, es decir, en input type text e input type password. Para implementar esta nueva mejora, es tan sencillo como añadir un nuevo atributo placeholder al elemento input con el texto que queramos que muestre en pantalla. A continuación os muestro un formulario de login como ejemplo de como se utilizarían estos nuevos atributos:

<form>
  <input class="user" type="text" placeholder="Usuario" />
  <input class="pass" type="password" placeholder="Contraseña" />
  <input type="submit" />
</form>

¿Es sencillo verdad? Ahora vamos a complicarlo un poco, vamos a darle estilos. Todo el mundo sabe como darles estilos a un elemento, en este caso a un input, pero…. ¿Cómo dar estilos a un placeholder? Tan solo hay que utilizar unos selectores de css especiales porque aún no estan soportados oficialmente por los navegadores, así que funcionan a modo de extensiones experimentales, como el moz-border-radius que lleva unos 7 años en modo experimental. En este caso utilizaremos 2 extensiones, una para webkit (chrome, safari, etc) y otra para mozilla (firefox). Las extensiones son: -webkit-input-placeholder y -moz-placeholder. Os pongo un ejemplo:

.user::-webkit-input-placeholder, .user::-moz-placeholder {
  color: blue;
}

.pass::-webkit-input-placeholder, .pass::-moz-placeholder {
  color: red;
}

Ahora tenéis un formulario de login la mar de mono, con los placeholder azules para el usuario y rojo para la contraseña. Espero que os sirva de ayuda para hacer formularios mas bonitos con HTML5.

Twitter Bootstrap el framework frontend the twitter

Hoy os quiero hablar de una herramienta web muy útil. Todos conocemos los framework de programación en distintos lenguajes, que si pylons, django, aspnet mvc, etc. Pero ¿Qué pasa con los framework de diseño? En internet podemos encontrar miles de themes gratuitos para utilizar en nuestra página, pero pocos son los que podemos utilizar como base genérica y aquí es donde aparece bootstrap.

Bootstrap es un framework de maquetación web desarrollado por Twitter y que de hecho se utiliza en este servicio, así como en otros muchos como ohloh o masterbranch por poner un par de ejemplos. Desde hace bastante tiempo lo utilizo en mis proyectos personales ya que provee de una buena base de estilos y estructura genéricos.

Bootstrap incorpora:

  • Scaffolding: estilos globales que resetean el tipo de body, enlaces, sistema de grids y layouts.
  • Base CSS: estilos para elementos comunes de html como tipografía, tablas, formularios y botones. Incluye Glyphicons, una librería de iconos libre.
  • Componentes: estilos comunes como tabs, barras de navegación, breadcrumbs, encabezados, etc.
  • Plugins de javascript: componentes comunes de javascript como tooltips, modals, etc.

Lista de componentes:

  • Grupo de botones
  • Botones desplegables
  • Tabs y listas de navegación
  • Barras de navegación
  • Etiquetas
  • Encabezados y destacados
  • Thumbnails
  • Alertas
  • Barras de progreso
  • Modals
  • Desplegables
  • Tooltips
  • Accordion
  • Sliders

Tenéis mas información en la web de Twitter Bootstrap.

Lanzar comandos de consola con python y paramiko

A veces, desde una web o un script de python, necesitamos poder ejecutar comandos de consola. Para lanzar comandos tenemos 2 formas, una es ejecutar directamente en la consola mediante system y la otra es utilizar un cliente de ssh como paramiko.

En el paquete os tenemos una función llamada system que ejecuta directamente un comando como en consola pasandole como parámetro el comando a ejecutar. Este es el ejemplo más sencillo que podemos hacer. Aunque hay otras formas como por popen, creo que para cosas sencillas es mas rápido os.system. Recordad que hay que importar el paquete os antes de usarlo.

Otra forma de ejecutar comando de consola es hacer uso de paramiko, un magnífico cliente de ssh para python. Con paramiko, podremos hacer uso desde python de conexiones por ssh y sftp, por lo que podremos trabajar directamente contra servidores linux de una forma sencilla. Decir que paramiko no viene por defecto con python y deberéis instalarlo de la página oficial de paramiko o con pip. Recordad también que para utilizar paramiko es recomendable configurar claves ssh para acceder sin contraseña. Para establecer una conexión por ssh con paramiko utilizaremos paramiko.SSHClient para crear un nuevo cliente ssh al que posteriormente conectaremos a un servidor con unas credenciales y por último utilizaremos client.exec_command con nuestro comando a ejecutar. Como veis esto es muy sencillo, aunque puede complicarse por temas de claves, permisos y demás. Ahora unos ejemplos.

Os dejo a continuación un ejemplo de ejecución de un comando por consola:

import os

os.system("cp -r directorio1 directorio2")

Os dejo un ejemplo de conexión con paramiko:

import paramiko

client = paramiko.SSHClient()
client.set_missing_host_key_policy(paramiko.AutoAddPolicy())
client.connect("miserver", username="miusuario", password="mipass")

stdin, stdout, stderr = client.exec_command("cp -r directorio1 directorio2")

Microsoft prefiere GIT, codeplex y la influencia de github

CodeplexCodeplex, la famosa web de forge de Microsoft me sorprende cada día mas. Aunque Codeplex no me gusta tanto como Github, es cierto que da muy buena salida a los proyectos realizados en .Net, por lo que aunque en mis proyectos open source utilizo Github, tengo los repositorios clonados en Codeplex. Microsoft cada día me sorprende mas, si ya me sonreía al entrar en la pagina de asp.net y encontrar que muchos proyectos que Microsoft recomienda, muchos de ellos eran en PHP. Ahora Microsoft vuelve a sorprender, esta vez con Codeplex, donde originalmente se ofrecían servicios de control de código fuente por Team Foundation, poco a poco han ido ampliando la variedad de servicios, añadiendo SVN, Mercurial y poco después GIT.

Si navegamos entre los diferentes repositorios de Codeplex, podremos encontrar el de ASP.Net MVC, que curiosamente, no está en Team Foundation, ni SVN, no no, esta en GIT y solo GIT. Curioso ver esta jugada de Microsoft, ¿Será que los propios ingenieros prefieren usar la potencia de GIT en lugar de sus propias herramientas? Para el interesado que quiera verlo, puede entrar en la web del proyecto de ASP.Net MVC en Codeplex.

Lenguajes de programación semánticos (python) contra matemáticos (c#)

Hace tiempo escribí un artículo en el que hablaba de frameworks web para programar y fui criticado por criticar django. Bueno como aclaratoria, escribo este artículo, en el que detallo las diferencias de los programadores, una gran batalla entre lenguajes semánticos vs matematicos; en este caso python vs c#.

Veamos primero que es cada uno, un lenguaje semántico es un lenguaje de programación que pretende ser similar a un lenguaje real, como el español, inglés, etc. mientras que un lenguaje matemático es mas parecido a ecuaciones con llaves, corchetes, paréntesis, etc. Pero veamos mas diferencias, un lenguaje semántico, sea cual sea, persigue el «de un vistazo», generalmente esta ausente de llaves y basa su estructuración en identación y estructuras muy semánticas como delimitadores de texto. Para este caso tenemos como ejemplo a VB, en el que terminamos un if con un End If, un for con un Next, etc. la identación automática que propone el propio ide de programación o como en el caso de Python, la identación es necesaria para que el interprete de Python entienda el código.

Un lenguaje matemático es en contra de un lenguaje semántico, un lenguaje de formulas y ecuaciones, que sin tener unas nociones de matemáticas y que estas nos gusten se nos pueden atragantar bastante. A diferencia de lo que ocurre en los lenguajes semánticos, este tipo de lenguajes a pesar de que la identación suele ser importante para la claridad y el entendimiento, también nos permite escribir todo nuestro código en una sola línea. Las funciones suelen estar delimitadas por llaves {} así como las clases y namespaces. Las lineas de un lenguaje matemático suelen estar delimitadas por puntos y coma «;», y como mencione antes, al tener delimitadores de linea todo el código puede estar en una única linea, como ocurre en el caso de los frameworks de javascript que comprimen su código hasta que ocupe una única linea.

¿Pero qué es mejor? Pues depende de la persona, igual que hay zapatillas para los corredores según su tipo de pisada, hay lenguajes según como programes. Hay programadores que son mas de letras, les gusta ver su código y creer que están leyendo un libro. Para ellos, un lenguaje semántico es ideal, un python o un visual basic. Para aquellos programadores que como me ocurre a mi, nos gusta ver una cierta simetría en nuestro código y que al ver el código parezca una libreta de un matemático, lleno de formulas, lenguajes como c# o java, son para mi.

¿Y cual es mejor? Pues ninguno. Lo mas importante es sentirse a gusto con el entorno con el que se trabaja. Si por ejemplo, eres un matemático puro, python es horrible, pero no quiere decir que no lo puedas utilizar. Por contra, si eres muy semántico, c# sería incomprensible. A la hora de trabajar, hay que tener en cuenta 3 factores básicos. En primer lugar en que lenguaje nos sentimos mas cómodos. Evidentemente no vamos a programar como no nos gusta (salvo que nuestro jefe nos lo diga). En segundo lugar hay que saber elegir bien el lenguaje con sus herramientas. En Lenguajes como PHP tenemos multitud de librerías y aplicaciones ya desarrolladas, en python django tenemos muchos módulos, etc. en c# el deploy es muy sencillo, pero no se nos ocurriría hacer una web en shell script por ejemplo, ya que no tenemos el mismo potencial de librerías. Por último hay que elegir sabiamente según lo que vayamos a hacer. Si por ejemplo vamos a desarrollar una pequeña aplicación, con un PHP vamos sobrados, si queremos generar una página sencilla, podemos utilizar django, pero si queremos hacer una aplicación grande y escalable, quizás c# nos convenga mas. Hay que saber equilibrar todo estos puntos para elegir siempre la mejor opción según lo que vayamos a desarrollar.

Yo programo las aplicaciones prefabricadas (wordpress, prestashop, etc) o páginas muy muy sencillas en PHP, otros proyectos a medida de mayor envergadura pero pequeños en python con django o pylons y los grandes proyectos en c# con mono aspnet mvc y AltairStudios.Core. Y tu, ¿En qué programas?

Deploy de ASP.Net MVC en Apache con mod_mono

Lo que voy a escribir aquí no es una guía de como instalar Mono ASP.Net con MVC sobre apache con mod_mono, aunque la escribiré, sino como hacer el deploy de una aplicación. Cuando montamos un sistema Mono ASP.Net con MVC sobre apache con mod_mono, hay que tener 3 cosas en cuenta para su correcto funcionamiento, son pequeños detalles pero que te pueden dar algún que otro quebradero de cabeza. Las 3 cosas a tener en cuenta son:

  • Apache no entiende que tu app es MVC, por lo que hay que decirselo.
  • Apache ni mod_mono son capaces de dictaminar tu index
  • Siempre hay que tener algo para recompilar el backend en caso de cacheo o fallo (generalmente cuando desarrollamos).

Bueno, expliquemos cada una, en primer lugar apache no sabe que tu app es un MVC de ASP.Net, por lo que cuando hagamos un deploy o creemos un proyecto nuevo de Mono ASP.Net con MVC, lo primero a crear es un .htaccess forzando a que es un MVC. El código del htaccess es:

ForceType application/x-asp-net

Con esto ya  podemos poner a funcionar nuestra aplicación web. El siguiente paso para hacer las cosas bien, sería crear un index, ¿Por qué? ¿Acaso no saben cual es mi index? Pues no, todas las pruebas, tanto en Linux como en Mac OS X, es que mod_mono no es capaz de entender cual es el index que definimos en el global.asax, por lo que lo mejor es crear un index.aspx que cargue nuestro HomeController, o el que queramos. El index estaría en el raiz del proyecto y su código sería:

<%@ Page Language="C#" Inherits="System.Web.Mvc.ViewPage" %>
<%
   this.Context.RewritePath("Home", false);

   IHttpHandler httpHandler = new MvcHttpHandler();
   httpHandler.ProcessRequest(this.Context);
%>

Lo que hacemos con este index.aspx es decirle que cuando cargue la home (el index) cargue automáticamente el HomeController. Ahora solo nos falta crear un sistema de reseteo de backend por si se queda en cache y queremos cambiar algo. Para ello creamos una carpeta, por ejemplo, reset-mono-backend y creamos un .htaccess dentro de esa carpeta. Cabe decir que al htaccess lo podemos otorgar de un sistema de autentificación y cosas por el estilo para acceder, pero como esto es un ejemplo, será lo más básico. El contenido del .htaccess será:

ForceType None
SetHandler mono-ctrl

Al entrar en /nuestroproyecto/reset-mono-backend, nos aparecerá una interfaz que nos permitirá entre otras cosas, resetear el backend. Otro día explicaré como se instala el sistema en si.

Buscar por tag, clase e id en jquery

Hace tiempo escribí un artículo hablando de rendimiento de jQuery y el uso de selectores dobles con jQuery, pero lo que no he hecho es explicar como funciona un selector de jQuery. La idea es que esto no sea «la guía definitiva de jQuery», ni nada por el estilo, sino un breve apunte para los lectores, la visión mas básica del uso de jQuery.

En este artículo voy a exponer como seleccionar de forma mas que simple utilizando un tag (etiqueta de html), una clase de css y un id. jQuery es un ente muy inteligente y por tanto, sabrá si lo que le estamos pidiendo es que convierta una etiqueta a jQuery o que la busque.

  • Buscar por tag con jQuery: este junto con el de clase, son métodos de búsqueda de poco rendimiento y que pueden dar como resultado varios objetos (ya que un tag se puede repetir), se indicaría a jQuery el nombre del tag.
  • Buscar por clase con jQuery: al igual que el anterior, es de bajo rendimiento y dará como resultado un array de objetos, ya que una clase se puede repetir.
  • Buscar por id con jQuery: es el mas optimo y el que se ha de usar siempre que sea posible. Devolverá un único objeto ya que los id’s en teoría no se repiten.

Ahora vista un poco la teoría viene la practica. Lo primero es entender como se hace la llamada a jQuery, que tiene 2 formas, la original que es usando la función jQuery o la corta que es usando su alias a la función $. Veamos un ejemplo genérico de esto y luego uno por cada selector.

var selectorjQuery = jQuery("#mi_id_a_seleccionar");
var selectorAlias = $("#mi_id_a_seleccionar");

En el ejemplo anterior, el resultado sería el mismo, ya que es similar utilizar la función jQuery que la función $. Ahora veamos un ejemplo con los selectores, con un código en html y otro de código javascript.

<p>
   <a href="#">Mi link 1</a>
   <a href="#" class="enlace">Mi link 2</a>
   <a href="#" class="enlace" id="myLink">Mi link 3</a>
</p>

Ahora vamos a hacer lo siguiente, con estos enlaces, vamos a poner el color del enlace en negro para todos los enlaces, rojo para los enlaces que tienen una clase enlace y azul para el id myLink

//ponemos todos los enlaces a negro
$("a").css("color", "#000");
//los enlaces con la clase .enlace los dejamos en rojo
$(".enlace").css("color", "#ff0000");
//el enlace con el id myLink lo ponemos azulado
$("#myLink").css("color", "#336699");

Como podemos observar, las etiquetas se indican con su nombre, las clases como si de css se tratase, con un punto delante, al igual que los ids, que al igual que css utilizan una almohadilla.

Habilitar sesiones en un handler.ashx con IRequiresSessionState e IReadOnlySessionState

En .Net, bien sea en C# o en VB.Net, hay un tipo de clases llamadas controladores genéricos que nos proveen de un nivel muy básico de controlador web. En ASP.Net, los handlers o  HttpHandler son un tipo de clases tan básicas, que no implementan entre otras cosas, las sesiones, por lo que tendremos que indicar explícitamente en la clase que tipo de sesión vamos a implementar.

Me voy a centrar en explicar 3 casos que son los más comunes, a la hora de implementar un handler:

  • Sin sesión: para esto no hay que hacer nada, con la declaración por defecto nos es suficiente. No tendremos acceso a la sesión, que sera nula si hacemos un context.Session
  • Sesión de solo lectura: para esto debemos implementar la interfaz IReadOnlySessionState, de tal modo que al hacer context.Session, tenga los valores de la sesión, pero no podremos añadir o actualizar datos sobre la sesión.
  • Sesión de lectura y escritura: para esto debemos implementar la interfaz IRequiresSessionState, que nos permitirá acceder a los datos de la sesión, así como añadir y actualizar los datos.
A continuación dejo unos ejemplos en C# y en VB.Net para que os hagais una idea.
[sourcecode language=»csharp» title=»Ejemplo de implementación de handlers en C#»] //Este ejemplo devolverá un error ya que context.Session es Nothing
public class IndalcasaSessionHandler : System.Web.IHttpHandler {
public void ProcessRequest(HttpContext context) {
Object value;

context.Session.Add("value", "un valor");
value = context.Session.Item("value");

context.Response.Write(value);
}
}

//Este ejemplo no devolverá un error ya que context.Session no es Nothing
//pero value tendrá el valor original que tuviera y no el valor "nuevo valor"
//ya que no se puede escribir en la sesión
public class IndalcasaSessionHandler : System.Web.IHttpHandler, System.Web.SessionState.IReadOnlySessionState {
public void ProcessRequest(HttpContext context) {
Object value;

context.Session.Add("value", "un valor");
value = context.Session.Item("value");

context.Response.Write(value);
}
}

//Este ejemplo no devolverá un error ya que context.Session no es Nothing
//y actualizará el valor de la sesión correctamente
public class IndalcasaSessionHandler : System.Web.IHttpHandler, System.Web.SessionState.IRequiresSessionState {
public void ProcessRequest(HttpContext context) {
Object value;

context.Session.Add("value", "un valor");
value = context.Session.Item("value");

context.Response.Write(value);
}
}
[/sourcecode] [sourcecode language=»vb» title=»Ejemplo de implementación de handlers en VB.Net»] ‘Este ejemplo devolverá un error ya que context.Session es Nothing
Public Class IndalcasaSessionHandler
Implements System.Web.IHttpHandler

Sub ProcessRequest(ByVal context As HttpContext) Implements IHttpHandler.ProcessRequest
Dim value As Object

context.Session.Add("value", "un valor")
value = context.Session.Item("value")

context.Response.Write(value)
End Sub
End Class

‘Este ejemplo no devolverá un error ya que context.Session no es Nothing
‘pero value tendrá el valor original que tuviera y no el valor "nuevo valor"
‘ya que no se puede escribir en la sesión
Public Class IndalcasaSessionHandler
Implements System.Web.IHttpHandler, System.Web.SessionState.IReadOnlySessionState

Sub ProcessRequest(ByVal context As HttpContext) Implements IHttpHandler.ProcessRequest
Dim value As Object

context.Session.Add("value", "nuevo valor")
value = context.Session.Item("value")

context.Response.Write(value)
End Sub
End Class

‘Este ejemplo no devolverá un error ya que context.Session no es Nothing
‘y actualizará el valor de la sesión correctamente
Public Class IndalcasaSessionHandler
Implements System.Web.IHttpHandler, System.Web.SessionState.IRequiresSessionState

Sub ProcessRequest(ByVal context As HttpContext) Implements IHttpHandler.ProcessRequest
Dim value As Object

context.Session.Add("value", "nuevo valor")
value = context.Session.Item("value")

context.Response.Write(value)
End Sub
End Class
[/sourcecode]

Espero que os saque de un apuro en el que alguna vez me he visto metido por no recordar las interfaces que hay que implementar para poder leer y/o escribir en la sesión en un controlador genérico de ASP.Net.

Double.Parse y Decimal.Parse con símbolos de putuación

Un problema que me encuentro a menudo en .Net por igual en Visual Basic o en C#, es cuando tengo que parsear un decimal o un double desde un string. Muchas veces, cuando parseas un double o un decimal, encontramos un error ya que en operaciones matemáticas, el símbolo de puntuación para la parte decimal es el punto, por lo que al hacer un Double.Parse(number) o un Decimal.Parse(number), lo que hace es ignorar el punto y por tanto tomar la parte decimal como si fuera parte entera. Para que esto no nos pase, tenemos que indicar que el sistema numérico utilizado es el matemático, aquel que no varia con la cultura. Con un ejemplo se verá mas claro.

Un ejemplo en C#:

[sourcecode language=»csharp» title=»Ejemplo en C#»] string number = "15.3";
double doNumber;
decimal deNumber;

doNumber = double.Parse(number);
deNumber = decimal.Parse(number);

/*
Los valores son:
doNumber = 153
deNumber = 153
*/

doNumber = double.Parse(number, CultureInfo.InvariantCulture);
deNumber = decimal.Parse(number, CultureInfo.InvariantCulture);

/*
Los valores son:
doNumber = 15.3
deNumber = 15.3
*/
[/sourcecode]

Un ejemplo en VB.Net

[sourcecode language=»vb» title=»Ejemplo en VB.Net»] Dim number As String = "15.3";
Dim doNumber As Double;
Dim deNumber As Decimal;

doNumber = double.Parse(number);
deNumber = decimal.Parse(number);

‘Los valores son:
‘doNumber = 153
‘deNumber = 153

doNumber = double.Parse(number, CultureInfo.InvariantCulture);
deNumber = decimal.Parse(number, CultureInfo.InvariantCulture);

‘Los valores son:
‘doNumber = 15.3
‘deNumber = 15.3
[/sourcecode]

CultureInfo es una clase que provee de información de las culturas y en concreto, la propiedad InvariantCulture o CultureInfo.InvariantCulture, es quien provee la información de la cultura que no varia por localizaciones, vease el simbolo de puntuación matemático. La clase CultureInfo se encuentra en el namespace System.Globalization, quedado la ruta así: System.Globalization.CultureInfo.InvariantCulture.

Scroll al inicio