viernes, 26 de septiembre de 2008

String.format

String.Format
Una Forma elegante de concatenear String y algo mas.

Por lo general en visual Basic hacia algo por el estilo
Dim nombre as "victor"
Dim foo as string = "hola mi nombre es " + nombre + "."

el resultado de esto es: Hola mi nombre es Victor.

se bastente feo verdad.
mejor usar String.format, se ve mas bonito y es mas mantenible
string nombre = "Victor";
string foo = string.Format("hole mi nombre es",nombre);

el resultado de esto es: Hola mi nombre es Victor


String.format recibe multiples argumentos, algo parecido a printf de C.

No tan solo sirve para concatenar, si no que tambien para dar formatos a fechas y numeros.

por ejemplo:
string.format("Hoy es {0:F}", DateTime.Now);


Aqui les dejo una referencia.



--
Atte.
Victor Hugo Saavedra
http://vhspiceros.blogspot.com

14 comentarios:

  1. Cool.

    Como referencia en Java 1.5 y superior tambien tienes String.format(), pero con un comportamiento mas cercano al printf de C ("%s" significa que ahi va un string, "%d" un entero decimal, etc, etc).

    Y en Python es simplemente un operador (el simbolo de porcentaje: %), lo que
    lo hace mas conciso:

    >>> nombre = "Perico"
    >>> print "Hola %s" % nombre
    Hola Perico

    ResponderEliminar
  2. Respuestas
    1. Este comentario ha sido eliminado por el autor.

      Eliminar
  3. Básicamente String.Format permite dar formato a una variable de tipo string a través de máscaras, lo cual es muy util sobre todo para desplegar fechas, valores moneda, etc...

    Pero en cuanto a concatenar cadenas de texto, sobre todo cuando existe la necesidad de hacer numerosas concatenaciones, la manera más eficiente se logra creando una instancia de StringBuilder.

    StringBuilder representa un buffer de tipo string, que implica una ganancia significativa de rendimiento al hacer numerosas concatenaciones, ya que versus la forma natural de concatenar strings a través del operador de adicion, el cual hace que con cada concatenacion se reserva memoria para almacenar una nueva copia del string concatenado, StringBuilder crea una lista dinámica con cada elemento creando solo una copia del elemento total al llamar al metodo ToString().

    Cuantitativamente, a mayor cantidad de concatenaciones hay una ganancia de O(n) en la concatenacion estándar contra O log(n) de la concatenacion via StringBuilder.

    Saludos

    ResponderEliminar
  4. Felipe: Define "ganancia". No se entiende si hablas de que una concatenación tiene un costo proporcional a n (o a log(n)) en tiempo o en espacio. Y como sea, no entiendo de donde sacas el log(n).

    Por otra parte, al menos en Java cuando se concatena con "+" el compilador reemplaza eso por un StringBuilder internamente. O sea, no hay que hacer nada especial...

    ResponderEliminar
  5. O sea, no hay que hacer nada especial...

    Uhm. acabo de dar un pésimo consejo. En realidad lo que hay que hacer es entender cuando el código que usa "+" es equivalente a usar el StringBuilder (y por lo tanto es preferible dejarlo tal cual para que sea más legible).

    Y también hay que entender cuando realmente vale la pena micro-optimizar y cuando no (hint: usar un profiler).

    ResponderEliminar
  6. Leo,
    Tienes razon, puede ser impreciso hablar de una mejora de rendimiento cuantitativa en terminos de tiempos de ejecucion en funcion de las iteraciones, pero la idea es dejar claro que usar StringBuilder rinde mejor que la concatenacion con el operador de adicion. el n representa el numero de concatenaciones a realizar.

    Esta afirmacion es correcta para .NET, desconocia el comportamiento del homologo en Java. Si Java por defecto convierte las instancias del operador de suma entre operandos string en una instancia de StringBuilder, es algo bastante inteligente de hacer. En contraste con .NET no es asi.

    La mejora en rendimiento depende de la frecuencia con que se concatena, pues con el operador de adicion, se crea en memoria una referencia a un nuevo espacio para alojar una copia completa del string nuevo resultante de la concatenacion. Si consideras cadenas de texto muy extensas y numerosas concatenaciones esto seria bastante caro en terminos de procesamiento.

    En su lugar, StringBuilder devuelve una referencia a si mismo en su ubicacion de memoria asignada en el minuto de la creacion del objeto, con un tamaño fijo por defecto. En pocas palabras es un buffer. Si el resultado de las concatenciones exceden en el tamaño original del buffer, entonces se crea una nueva instancia del objeto, con mas capacidad, luego se copia la cadena resultante y se devuelve una referencia a este nuevo objeto.

    Si se conoce de antemano el tamaño aproximado del buffer resulta ideal evitar la creacion de copias de la cadena indicando el tamaño inicial a traves de EnsureCapacity() o a traves de la version sobrecargada del constructor de la clase.

    Aqui un vinculo:

    StringBuilder (Clase) (System.Text)

    Saludos!!

    ResponderEliminar
  7. Disculap coo poria hacer un progra en C# q me concatene los nombres al introducir y en el momento de ejecutar q me diga el nombre y la posicion en la q se encuentra el nombre q yo deseo saber

    ResponderEliminar
  8. se me ocurre algo asi

    "Victor Hugo Saavedra".IndexOf("Victor");
    "Victor Hugo Saavedra".IndexOf("Hugo");

    var nombres = "victor Hugo Saavedra";
    nombres.IndexOf("Hugo");

    el index of retorna un Int, en caso de que no lo encuentre devuelve un -1.

    despues tomas la cadena y le haces un substring, con el indice obtenido.

    Ojala te sirva.

    --
    Atte.
    Victor Hugo Saavedra
    http://vhspiceros.blogspot.com

    ResponderEliminar
  9. Primero, el post esta escrito muy mal.

    Segundo, las concatenaciones en Java, por ejemplo:

    String cadena = "juan";
    cadena += "es";
    cadena += "genial";

    No usan internamente StringBuilder, justamente, esa concatenación le es carisima a la JVM, motivo por el cual, por motivos de performance, se usa StringBuilder(StringBuffer tiene la mismas funcionalidades pero esta sincronizada).

    La concatenación que puse de ejemplo genera un espacio en el String Pool para "Juan", "Juan es" y "Juan es genial" mientras que StringBuilder no. La razon es que String es un objeto inmutable.

    ResponderEliminar
  10. Usar String.format para concatenar cadenas simples sin formateo es totalmente ridiculo. Es como usar un martillo neumático para levantar el piso de la cocina.

    ResponderEliminar
  11. Cambia la foto, Victor, por el éxito de tu blog. A veces, hay cosas que hay que mantenerlas ocultas.

    ResponderEliminar
  12. Abel:

    primero que todo muchas gracias por visitar y leer el blog, si bien no es el fin principal se agradece todas formas.

    con respecto a lo primero, si tienes toda la razon, tengo horrible redaccion y escritura:(.

    con respecto a usar string.format, me parece que no leiste todos los comentarios de esta entrada, hay una conversacion bien entretenida entre felipe y leo Soto.

    ResponderEliminar
  13. Victor, muy buena info me sirvio para interiorizarme un poco mas en el string.format

    Te dejo un link el cual explico con un poco mas de detalle
    http://java-white-box.blogspot.com.ar/2012/12/java-player-como-unir-cadenas-string-en.html

    Saludos

    ResponderEliminar