1107 votos

JavaScript equivalente a printf/string.format

Estoy buscando un buen JavaScript equivalente de la C/PHP printf() o para C#/programadores Java, String.Format() (IFormatProvider de .NET).

Mi requisito básico es un formato de separador de miles para números, por ahora, pero algo que maneja un montón de combinaciones (incluyendo fechas) sería bueno.

Me doy cuenta de Microsoft Ajax library proporciona una versión de String.Format(), pero no queremos que la totalidad de la sobrecarga de ese marco.

921voto

fearphage Puntos 7213

Edificio en el anteriormente las soluciones que se sugieren:

// First, checks if it isn't implemented yet.
if (!String.prototype.format) {
  String.prototype.format = function() {
    var args = arguments;
    return this.replace(/{(\d+)}/g, function(match, number) { 
      return typeof args[number] != 'undefined'
        ? args[number]
        : match
      ;
    });
  };
}

"{0} is dead, but {1} is alive! {0} {2}".format("ASP", "ASP.NET")

salidas

ASP está muerto, pero ASP.NET está vivo! ASP {2}


Si usted prefiere no modificar String's prototipo:

if (!String.format) {
  String.format = function(format) {
    var args = Array.prototype.slice.call(arguments, 1);
    return format.replace(/{(\d+)}/g, function(match, number) { 
      return typeof args[number] != 'undefined'
        ? args[number] 
        : match
      ;
    });
  };
}

Le da el mucho más familiar:

String.format('{0} is dead, but {1} is alive! {0} {2}', 'ASP', 'ASP.NET');

con el mismo resultado:

ASP está muerto, pero ASP.NET está vivo! ASP {2}

500voto

Gumbo Puntos 279147

Trate de sprintf() de JavaScript.


Actualización de Aceptar, si usted realmente quiere hacer un formato sencillo método en su propia, no hacer los reemplazos sucesivamente, pero no simultáneamente.

Debido a que la mayoría de las otras propuestas que se mencionan a fallar cuando una cadena de reemplazo de la anterior, la sustitución también contienen un formato de secuencia como esta:

"{0}{1}".format("{1}", "{0}")

Normalmente se puede esperar que la salida {1}{0} pero la salida real es {1}{1}. Así que, simultáneamente, la sustitución en el lugar en fearphage sugerencia.

232voto

rescdsk Puntos 4136

Formato de número en JavaScript

Llegué a esta página de preguntas con la esperanza de encontrar la forma de dar formato a números en JavaScript, sin la introducción de otra biblioteca. He aquí lo que he encontrado:

Redondeo de números de punto flotante

El equivalente de sprintf("%.2f", num) en JavaScript parece estar num.toFixed(2), que los formatos num 2 decimales con redondeo (pero ver a @ars265 comentario sobre Math.round abajo).

12.345.toFixed(2); // returns "12.35" (rounding!)
12.3.toFixed(2); // returns "12.30" (zero padding)

Forma exponencial

El equivalente de sprintf("%.2e", num) es num.toExponential(2).

33333 .toExponential(2); // "3.33e+4"
//   ^ Note the space, which keeps the . from being a decimal point.
//     Leaving out the space is a syntax error :-(

Hexadecimal y otras bases

Para imprimir los números en base B, intente num.toString(B). JavaScript soporta la conversión desde y hacia bases 2 hasta 36 (además, algunos de los navegadores tienen soporte limitado para la codificación base64).

3735928559 .toString(16); // to base 16: "deadbeef"
parseInt("deadbeef", 16); // from base 16: 3735928559

Páginas De Referencia

Tutorial rápido sobre la JS formato de número

Mozilla página de referencia para toFixed() (con enlaces a toPrecision(), toExponential(), toLocaleString(), ...)

144voto

Filipiz Puntos 915

jsxt, Zippo

Esta opción se ajusta mejor.

String.prototype.format = function() {
    var formatted = this;
    for (var i = 0; i < arguments.length; i++) {
        var regexp = new RegExp('\\{'+i+'\\}', 'gi');
        formatted = formatted.replace(regexp, arguments[i]);
    }
    return formatted;
};

Con esta opción que pueda reemplazar cadena como esta:

'The {0} is dead. Don\'t code {0}. Code {1} that is open source!'.format('ASP', 'PHP');

Con el código de la segunda {0} no serán reemplazados. ;)

69voto

Zippoxer Puntos 2271

Yo uso esta sencilla función:

String.prototype.format = function() {
    var formatted = this;
    for( var arg in arguments ) {
        formatted = formatted.replace("{" + arg + "}", arguments[arg]);
    }
    return formatted;
};

Que es muy similar a string.format:

"{0} is dead, but {1} is alive!".format("ASP", "ASP.NET")

Iteramos.com

Iteramos es una comunidad de desarrolladores que busca expandir el conocimiento de la programación mas allá del inglés.
Tenemos una gran cantidad de contenido, y también puedes hacer tus propias preguntas o resolver las de los demás.

Powered by:

X