Cuando StringFormat se pone de mal genio

Existen algunos caracteres que no son muy amigos del StringFormat. Insertarlos allí requiere un poquito de ingenio.

La propiedad en cuestión utilizada dentro de un Binding permite dar formato a un texto o a un número. Es muy útil porque permite, directamente en XAML, especificar la cadena de formato. Un ejemplo sencillo:

 

  1. <TextBlock Text="{Binding Valor, StringFormat=##0.00}" />

Aquí mostramos un número con dos decimales, algo así como 1200.45.

En resumen, todo es color de rosa hasta que intentas insertar en el formato una coma (,), una comilla sencilla (), una doble ("), un menor que (<), las llaves ( { } ) o el carácter ‘y’ (&). El problema radica en que todos estos son caracteres que tienen un significado especial en XML, y como XAML es XML, aquí también tenemos que darles un manejo especial. La coma no es uno de estos caracteres especiales, pero igual nos va a dar pelea poderla insertar. Concluyendo: no es tan sencillo incluirlos en la cadena de formato como si podemos hacerlo directamente en código. Escapar el carácter no funciona en todos los casos (\").

La magia, en algunos casos, está en utilizar el juego de caracteres {}, así:

 

  1. <TextBlock Text="{Binding Valor, StringFormat='{}#,##0.00′}" />

Aquí, encerrando entre comillas sencillas, pudimos insertar la coma (,) que en términos de formato representa el separador de miles de modo que obtendríamos algo como 1,200.45. El problema aquí con la coma es que tiene un significado especial dentro del Binding: separar sus componentes. Veamos como resolvemos el resto:

 

  1. <TextBlock Text="{Binding Valor, StringFormat='{}{{ {0:#,##0.00} }}’}" />

Aquí pudimos introducir las llaves ¿cómo se hizo? Las llaves izquierda y derecha están duplicadas y son las que están en los extremos del formato. Las que están al interior corresponden a las que utiliza el StringFormat para determinar elemento y formato a aplicar, de modo que obtendríamos algo como {1,200.45}. Siguiente caso:

 

  1. <TextBlock Text="{Binding Valor, StringFormat='{}&lt;#,##0.00′}" />

El ‘menor que‘ fue un poco más fácil porque todo lo que tenemos que usar es su código equivalente HTML, en este caso: &lt; con lo que obtendríamos <1,200.45. Mismo remedio para el carácter & utilizando su código HTML: &amp;.

Curiosamente no podemos hacer lo mismo con la comilla doble, cuyo código HTML es &quot; o " En este caso se requiere dar la vuelta por otro lado: extraer el Binding como un tag aparte, así

 

  1. <TextBlock>
  2.     <TextBlock.Text>
  3.         <Binding Path="Valor"
  4.          StringFormat="#,##0.00 \&quot; finalmente una comilla doble" />
  5.     </TextBlock.Text>
  6. </TextBlock>

¿Raro cierto? Escapamos el código HTML de la comilla doble para que pudiese salir. Y si es que lo intentan, en este caso no sirve \". Y finalmente la comilla sencilla, que requiere un truco similar al anterior:

 

  1. <TextBlock>
  2.     <TextBlock.Text>
  3.         <Binding Path="Valor"
  4.          StringFormat="#,##0.00 \’ finalmente una comilla sencilla" />
  5.     </TextBlock.Text>
  6. </TextBlock>

Como decimos por estos lados "más raro que un perro a cuadros". La comilla sencilla si pudimos insertarla escapándola tal como lo hacemos por código. También hubiéramos podido escapar su respectivo código HTML : \’

Otro misterio resuelto.

Anuncios

Acerca de SilverIdeas

Instructor y entusiasta en el uso de Silverlight y otras tecnologías XAML.
Esta entrada fue publicada en Silverlight y etiquetada , . Guarda el enlace permanente.

Una respuesta a Cuando StringFormat se pone de mal genio

  1. Ronny dijo:

    Buena explicacion pero no me solucione el hecho de poder poner 1646.21 ligeramente, quiero decir poner todo esos digitos incluido el punto por teclado, nose si me entiendes, esmolesto q tenga q dar a la fecla derecha para posicionarme en la parte de decimales, Saludos y buen articulo

Responder

Introduce tus datos o haz clic en un icono para iniciar sesión:

Logo de WordPress.com

Estás comentando usando tu cuenta de WordPress.com. Cerrar sesión / Cambiar )

Imagen de Twitter

Estás comentando usando tu cuenta de Twitter. Cerrar sesión / Cambiar )

Foto de Facebook

Estás comentando usando tu cuenta de Facebook. Cerrar sesión / Cambiar )

Google+ photo

Estás comentando usando tu cuenta de Google+. Cerrar sesión / Cambiar )

Conectando a %s