Archivado en: ‘Programación’ .

Centrar texto verticalmente con css

13 Marzo, 2010

Desde hace años que me pase a las capas abandonando la maquetación en tablas, si algo he hechado de menos siempre ha sido el "como centrar texto verticalmente sin valign". Para solucionar este problema, siempre he usado subcapas con margin o paddings o directamente padding superior en la capa padre para bajar el texto, aunque eso se comporta de manera distinta dependiendo del navegador. En una pagina que estoy montando me he puesto a investigar, como alguna vez hago con el intellisense mirando todo lo que me encuentro y en esta ocasión le ha tocado el turno al css. Buscando me he encontrado con un atribuo de css que se llama line-height, que agranda la linea del texto a la altura que le indiquemos, lo que quiere decir que si tenemos un menú, de pastillas de 50px de alto y le indicamos que el line-height es 50px, el texto aparecerá centrado. Realmente no es algo milagroso ya que no es dinámico, pero para menús y cosas así viene genial.

Os dejo un ejemplo de como se utilizaría:

Ejemplo del html:

 
<div id="menu">
<div class="menuOption">Inicio</div>
</div>
 

Ejemplo del css:

#menu {
  height: 50px;
}
 
.menuOption {
  line-height: 50px;
  text-align: center;
}

Con este ejemplo anterior, nos dibujaría una pastilla (mas o menos) y nos dejaría el texto centrado verticalmente y ya de paso centrado horizontalmente también.

Como dar formato a un número en xslt: format-number

10 Febrero, 2010

Para los que o bien nos guste, o bien nos vemos obligados a usar transformadas xslt a veces en exceso, muchas veces nos encontramos con algunos problemas como son los números. Cuando debemos de hacer operaciones que van mas allá de sumar y restar dentro de una transformada xslt, nos encontramos muchas veces con un gran problema al mostrar los resultados de las operaciones. Por ejemplo, un caso practico (el mio de hoy, aunque me pasa desde que empecé a trabajar con xslt), ha sido que tengo que mostrar un combo (select) con maletas, pero cuando el trayecto es español, como no, al precio de esas maletas (incluido en el combo) hay que añadir un 7% de iva. Al proceder a esto, muchas veces me aparecen números que son auténticos chorizos, por ejemplo 37.000000004€, por lo que queda un poco feo en un combo. La solución es dar formato al numero/variable y dejarlo truncado a 2 decimales.

Para dar formato a un numero en una transformada xslt, podemos utilizar la función nativa de xslt format-number. Esta función cuenta con 2 parámetros, un primero que especificamos el numero a dar formato y como segundo parámetro que especifica cual sera el formato que se le dará al numero. La función tendría un formato tal que:

/**
 * Función de xslt nativa e independiente del lenguaje, ya sea java, .Net, php, etc. para dar formato a un numero desde XSLT
 * pero a veces puede provocar algún que otro fallo dependiendo del lenguaje que la implementa.
 * @param number Numero a dar formato
 * @param format Formato que se le dará, se utilizan los caracteres ('0', '#', '.', ',', '%')
 * @return Numero con su formato especificado
 */
string format-number(string number, string format)
<xsl:variable name="variable" select="'7.35001'" />
<xsl:value-of select="format-number($variable, '#.00')" />
<!-- El resultado es: 7.35 -->

Para dar formato, podemos utilizar los siguientes caracteres:

  • '0': Los ceros, indican dígitos obligatorios, ignorando los ceros a la izquierda o derecha si son en la parte entera o decimal. Si por ejemplo tenemos el 34 y le aplicamos como formato 0000, nos quedaría tal que 0034. Lo mismo ocurre con los decimales, si tenemos nuevamente 34, el resultado de aplicar 0000.00 seria 0034.00.
  • '#': La almohadilla (#), sirve para dar formato a los dígitos ignorando los ceros innecesarios. Por ejemplo, si tenemos el 0034 y el 0034.0500 y le aplicamos el formato #.#, nos dará como resultado 34 en primer lugar y 34.1 en segundo lugar. OJO, que redondea los números, si pusiéramos al 0034.0500 dos almohadillas tal que #.##, quedaría 34.05. Tener en cuenta, además de que redondea los números, que ignorara todos los ceros que haya después de la posición que ocuparía la almohadilla, a diferencia del '0', que mantendría esos ceros.
  • '.': El punto se utiliza para establecer el limitador decimal, para diferenciar entre la parte entera y la decimal.
  • ',': La coma se utiliza para indicar si queremos y donde queremos situar los separadores de miles, por ejemplo, si tenemos 1000 y le aplicamos un formato tal que # o ####, el resultado siempre sera 1000, pero si aplicamos el formato #,### nos quedara 1,000, que manteniendo el formato y pasando 12350, quedaría 12,350 como resultado.
  • '%': Devuelve el resultado en %, como pasa en otros programas como el Excel, cuando le aplicamos el %, nos multiplicara por 100 y mantendrá el símbolo de porcentaje al final, tal que 7 con formato #% quedaría 700% como resultado.
  • Espero que os sirva tanto a vosotros como a mi.

Reemplazar texto en transformada xslt

20 Diciembre, 2009

Trabajo desde hace años usando de una forma intensiva las transformadas xslt, y a pesar de que son fáciles de utilizar y se pueden hacer infinidad de cosas, llegando al caso de ser propiamente dicho, un lenguaje de programación, hay algo que siempre he echado en falta. A pesar de que xsl tiene funciones para el tratamiento de cadenas como substring, startwith, concat, etc. nunca he visto que tenga una función para reemplazar texto, algo que seria muy útil. Siempre que he tenido que hacer un reemplazo de texto lo he hecho de diferentes formas, a cual mas chapucera. Si tenia que sustituir una frase entera, llenaba el xsl de xsl:if o de xsl:choose con sus consecuentes xsl:when, pero si tenia que sustituir parte de una frase, ya la cosa se complicaba mas, usando casi siempre el nombre de espacio user, y definiendo una función en el lenguaje que utilizaba (en mi caso .net), pero esto tiene un problema, si por algún casual, quiero migrar a otro lenguaje (que no veo yo a mi jefe mucho por la labor), la transformada no me serviría fuera del entorno de .net.

Para solucionar este problema, decidí crear una función de xsl, mas que una función es un template, pero como a mi me gusta usar los templates como funciones con parámetros, también me gusta llamarlas funciones. Bueno, el caso es que he creado una función/template, que recibe 3 parámetros, y que vendría a ser mas o menos como el replace de php, pero con el funcionamiento del replace de javascript, porque de momento solo reemplaza de 1 en 1, digamos que no es un replace all. La función recibe 3 parámetros, uno con el texto a base, la cadena de donde queremos reemplazar el texto, otro parámetro con el texto que va a ser reemplazado, y otro parámetro con el texto a reemplazar. El código de la función seria el siguiente:

<!-- Funcion replace -->
<xsl:template name="replace">
   <!-- Cadena de texto -->
   <xsl:param name="text" />
   <!-- Texto que va a ser reemplazado -->
   <xsl:param name="replaceText" />
   <!-- Texto a reemplazar -->
   <xsl:param name="replacedText" />
 
   <!-- El replace propiamente dicho -->
   <xsl:value-of select="substring-before($text,$replaceText)" />
   <xsl:value-of select="$replacedText" />
   <xsl:value-of select="substring-after($text,$replaceText)" />
</xsl:template>
 
<!-- Ejemplo de utilizacion -->
<xsl:variable name="price">
   <xsl:call-template name="replace">
      <xsl:with-param name="text" select="$xml/POSIBILIDADES_PRECIO-IDA" />
      <xsl:with-param name="replaceText" select="','" />
      <xsl:with-param name="replacedText" select="'.'" />
   </xsl:call-template>
</xsl:variable>

Espero que esta pequeña función para xsl, os sea tan útil como a mi. Por cierto, el ejemplo me lo saque de uno que monte en el curro, así que cada uno lo tendrá que modificar en base a sus necesidades. A ver si me lo curro un poco y modifico la función para que sea un replace all, en lugar de un replace one.

Mac Os X con PHP y Apache

29 Abril, 2009

Como buen desarrollador web y acostumbrándome poco a poco al uso de Mac OS X, me he decidido a ponerme de lleno con el juego web que estoy desarrollando. Para hacer esto tengo que instalar o debería de instalar primero un IDE para el desarrollo, luego Apache y PHP, la base de datos no porque utilizo la de mi hosting y así evitar ciertos pasos que de momento y dado que esta en una fase alfa, me lo puedo ahorrar.

Como IDE necesito uno que tenga Intellisense (que autocomplete código) que funcione bien y reconozca todo, tanto variables y funciones, como clases, herencias, métodos estáticos, declaración de tipo de objeto por parámetro a un método, etc. por esto solo conocía 2, el Zend Studio que esta muy bien pero también es de pago y no barato precisamente y un poco lento, pero con mi ordenador no creo que hubiera problemas. El otro IDE es el Eclipse que aunque me suele consumir unos 400MB de RAM al tener 4GB no habría problema y es bastante completo y rápido, además de completar con muchos plugins que tiene el Eclipse. Por ultimo y de casualidad he descubierto que han terminado el plugin de NetBeans para usarlo como IDE de PHP y la verdad es que para mi gusto es el mejor, ya que es muy rápido, consume muy poco, tiene implementado todo lo que necesito en un bloque muy solido (no como Eclipse que tiene plugins que no terminan de encajar entre ellos) y lo mejor de todo, que para mi gusto y como IDE, me gusta mucho el NetBeans y su sistema de organización. Así que por esto me he quedado con NetBeans como IDE de PHP.

Una vez esta el IDE instalado, necesito el motor PHP y el servidor web Apache. Buscando en el disco duro encuentro que hay referencias a Apache y en la conflagración de sistema, hay un método de compartir que se llama "Compartir web", que de arrancarlo lo que hacemos es poner en marcha el servicio de Apache2. Ahora nos toca PHP, que para mi sorpresa también tiene viene instalado en Mac Os X por defecto, lo único que tenemos que hacer es descomentar la linea en la que carga el modulo de PHP y reiniciar Apache y ya tenemos todo listo y configurado para trabajar.

La verdad es una sorpresa encontrarme con Java y PHP y Apache ya instalado, algo que nos ahorra mucho tiempo a la hora de instalar todo lo necesario para trabajar

Por ultimo comentar que lamentablemente MySQL si deberemos de instalarla, aunque es mas sencillo que instalar que en Windows por lo que tardaremos lo que tardaremos en bajar el archivo de MySQL, hacer doble click y ejecutar los 2 o 3 archivos que lleva en su interior.

Continue de un bucle en Visual Basic

13 Abril, 2009

Es curioso. El otro día estaba trabajando con unos bucles o loops como les dicen algunos, en el curro con Visual Basic .Net 1.1, es decir VB.Net en su versión de 2003. La verdad es que yo siempre he sido un hombre de bandera (jajaja) pero no se porque me empeñe en usar el continue. Probando con diferentes formas de ponerlo, "Continue", "Next" y alguna más que no recuerdo, buscando por internet y preguntando ha algun compañero, al final llegue a la conclusión, de que no existe un "Continue" ni equivalente en Visual Basic .Net, una lástima teniendo en cuenta que en C# si tiene continue. Seguiré usando mis banderitas que me funcionan en todos los lenguajes.

Por si hay alguien que no entiende para que sirve el continue, básicamente lo que hace es saltar a la siguiente iteración de un bucle ignorando todo el código de ese bucle desde que se llama hasta que llega al final del bucle, por llamarlo de alguna manera, "esta vuelta ha terminado".

Char curiosidad de IsLetter e IsDigit

25 Noviembre, 2008

El otro día, nos disponíamos mi jefe y yo a realizar un control sobre un campo de texto de una aplicación web. La idea era que en este campo solo se pudiera incluir texto o números, pero en ningún caso debería de poderse incluir caracteres raros. Seamos sinceros y siempre que hemos necesitado usar esto en lenguajes donde su framework no estaba preparado para diferenciar que tipo de carácter era, acabamos o bien creando un array diccionario y comparando los caracteres o bien usando expresiones regulares. Como no, desde el salto a tecnología de Microsoft (en este caso Visual Basic .Net) me propuse buscar alguna clase o método que hiciera solo lo que quería hacer, y la encontré.

En .Net existe la clase Char, que tiene el método Char.IsLetterOrDigit (boleano) donde le indicas un char o carácter y este te devuelve true o false si es un número o letra y false si no lo es. Monto una función para recorrer carácter a carácter del campo de texto comprobando si es alfanumérico o no, con la idea de borrar los caracteres que no sean alfanuméricos. Una vez montada la función, la pruebo unas cuantas veces y todo funciona estupendamente. Cuando nos vamos a disponer a subir a producción... sorpresa, la última prueba a fallado (pero es imposible), se nos deslizo el dedo y por poner un "1", pusimos un "º". Cuando nos ponemos a investigar (ha probar con jabatos) nos damos cuenta de que esta función, establece que los caracteres "º" y "ª" son alfanuméricos, vamos que son letras, supongo que la "o" y la "a".

Por supuesto esto lo controlamos y listo, pero si alguien se encuentra en nuestra misma situación y conoce alguna función que si trabaje correctamente que lo comente. Y si alguien buscando por internet se encuentra bloqueado y se ve encuentra con este post, ya puede respirar tranquilo, porque no es que funcione mal, es que no funciona del todo bien. (Si, ya se que para algunos "º" y "ª" son letras, pero realmente son caracteres especiales)

Bucle do-while en VisualBasic

26 Septiembre, 2008

Llevo tiempo currando con Visual Basic .Net, pero como persona formada desde hace años en lenguajes tipo C (C, C++, Java, C#, PHP, etc) el paso a programar en Visual Basic, cuesta mucho y cosas tan cotidianas como hacer un bucle, un switch o similares pueden convertirse en una peligrosa trampa que nos consumira muchos minutos muy valiosos.

La ultima que me he topado ha sido el bucle do while. En cualquier lenguaje tipo C, practicamente independiente del lenguaje estos bucles son iguales:

  do {
    sentencias
  } while(condicion);

Pero como no, estamos con Visual Basic y aqui todo funciona de manera diferente, es como nuestro tipico amigo que siempre lleva la contraria a todo. Por ejemplo para hacer un bucle do-while (me sorprende que en 9 meses sea la primera vez que me vea obligado a hacerlo, el bucle es do-loop-while, siendo su sintaxis

  Do
    sentencias
  Loop While condicio

Puede que la gente que conozca o programe en Visual Basic lo vea una tonteria, pero para gente como yo que por razones laborales se ven obligadas a programar en dicho lenguaje y que por muchos meses se que lleve sigan prefiriendo C# a VB.Net, cosas tan cotidianas pueden convertirse en un minimundo.

Ya de paso y para aprovechar el post, explico que los bucles do while, son bucles que se recorreran igual que los while, en funcion de una condicion que de ser cierta dara una vuelta mas al bucle y que la principal diferencia entre los bucles while y do while, radica en que el while, primero comprueba la condicion antes de hacer una iteracion al bucle, mientras que los do while primero dara una iteracion al bucle y al final comprobara si debe de seguir haciendo iteraciones. Dicho de otro modo, el el while, primero comprobamos que debemos entrar al bucle y de ser cierto, entramos, en los do while, primero entramos al bucle y al final de este comprobamos si debemos dar una vuelta mas.

Escapar texto en una transformada XSLT

18 Septiembre, 2008

Hace poco escribí como escribir el símbolo del euro en una transformada XSLT. Para completar lo que ya comenté en su momento, explicaré como se escapan caracteres en una transformada para no tener que recurrir a buscar códigos especiales de HTML tal como el €.

Para escapar texto dentro de una transformada existe un parámetro llamado disable-output-escaping que toma los valores yes|no, en función de si queremos o no deshabilitar que se escapen caracteres. Este atributo se aplica a 2 etiquetas de XSL, la etiqueta xsl:text y la etiqueta xsl:value-of, aunque seguramente se aplique ha alguno más.

Ejemplo de como funciona:

  <xsl:text disable-output-escaping="yes">
     <![CDATA[&euro;]]></xsl:text>
  <xsl:value-of select="$variable"
     disable-output-escaping="no" />
 

Cuando aplicamos disable-output-escaping sobre xsl:value-of, este deshabilitara el escapado si así se lo indicamos sobre el contenido de la variable. Por el contrario, al aplicarlo sobre el xsl:text, necesitamos poner el texto a escapar encerrado entre CDATA, ya que sino, puede dar errores.

Division y resto (modulo) con XSLT

26 Agosto, 2008

Cuando queremos hacer alguna operación sobre un par de número en una transformada (XSLT) lo hacemos con el símbolo + o *, la cuestión esta en cuando queremos dividir o calcular el resto o módulo de una división, los caracteres tradicionales para estas operaciones / y % entran en conflicto con XPath, por lo que no se pueden usar tal cual, por lo que usaremos las siguientes instrucciones.

Usaremos la palabra reservada div para realizar la división de 2 números, siendo el código.

  <xsl:value-of select="9 div 3"/>

Para realizar el calculo del módulo o resto de una división, usaremos la palabra reservada mod siendo su sintaxis igual que la del div.

  <xsl:value-of select="5 mod 2"/>

Espero que este articulo pueda ayudar a mucha gente ya que estube horas hasta dar con la solucion de como hacer una division en una transformada XSLT.

Reemplazar un texto en SQL Server con TSQL

9 Julio, 2008

Supongamos que tenemos un campo con un texto y lo recuperamos con una consulta SQL. Supongamos también que queremos cambiar parte del contenido de ese texto y reemplazarlo por otro, en este caso realizaríamos un replace por código (programación), pero y si esto no nos vale, y si necesitamos que sea por consulta todo. Para estos casos existe una funcion REPLACE que se ejecuta en SQL y es similar a la de la mayoría de lenguajes de programación.

La llamada a la función de reemplazo (REPLACE) se usara dentro de cualquier código SQL o TSQL en SQL Server. La función REPLACE tiene 3 parámetros, el texto original completo, el texto que se quiere buscar y por último el texto por el que se quiere sustituir como se hace en muchos lengaujes de programación.

La sintaxis sería:

  REPLACE(TEXTO, BUSCADA, SUSTITUIDA)

Un ejemplo de como se incrustaría el reemplazo en una consulta SQL sería:

  SELECT REPLACE(campo, 'a', 'b') FROM tabla

Aqui nos encontramos con el primer de los dos grandes problemas de reemplazar texto con esta función. El primer problema son los campos de tipo TEXT, que al parecer, para SQL Server son objetos diferentes que los campos de tipo CHAR o VARCHAR y para poder reemplazar un campo de tipo TEXT necesitamos hacer un pequeño HACK que nos convierta de tipo TEXT a tipo STRING como si de un VARCHAR se tratase.

El Hack en cuestion se trata de hacer un SUBSTRING desde la primera posición de la cadena hasta la última utilizando la longitud de la misma obtenida con la funcion DATALENGTH. De esta forma, con el SUBSTRING convertimos el tipo TEXT en un tipo STRING o VARCHAR y asi podemos reemplazar.

Un ejemplo seria:

  SELECT REPLACE(
    SUBSTRING(campo, 1, DATALENGTH(campo)),
    'a', 'b') FROM tabla

Y es aquí cuando nos encontramos con el segundo y mayor de los problemas y es la longitud de la cadena. Cuando trabajamos con una cadena de texto realmente larga, como podría ser una página web, el SUBSTRING o el REPLACE no devuelve la cadena completa, por lo que se nos cortara la respuesta y obtendremos solo parte del texto original, eso si, ya reemplazado.