Búsqueda de sitios web

javascript - Equivalente de String.format en jQuery


Estoy intentando mover algo de código JavaScript de MicrosoftAjax a jQuery. Uso los equivalentes en JavaScript en MicrosoftAjax de los métodos populares de .NET, por ejemplo, String.format(), String.startsWith(), etc. ¿Hay equivalentes a ellos en jQuery?

Respuesta #1

El código fuente de ASP.NET AJAX está disponible para tu referencia, así que puedes revisarlo y agregar las partes que quieras seguir usando en un archivo JS separado. O, puedes portarlas a jQuery.

Aquí está la función de formato...

String.format = function() {
  var s = arguments[0];
  for (var i = 0; i < arguments.length - 1; i++) {       
    var reg = new RegExp("\\{" + i + "\\}", "gm");             
    s = s.replace(reg, arguments[i + 1]);
  }

  return s;
}

Y aquí están las funciones prototipo endsWith y startsWith...

String.prototype.endsWith = function (suffix) {
  return (this.substr(this.length - suffix.length) === suffix);
}

String.prototype.startsWith = function(prefix) {
  return (this.substr(0, prefix.length) === prefix);
}

Respuesta #2

Esta es una variación más rápida/sencilla (y prototípica) de la función que Josh publicó:

String.prototype.format = String.prototype.f = function() {
    var s = this,
        i = arguments.length;

    while (i--) {
        s = s.replace(new RegExp('\\{' + i + '\\}', 'gm'), arguments[i]);
    }
    return s;
};

Uso :

'Added {0} by {1} to your collection'.f(title, artist)
'Your balance is {0} USD'.f(77.7) 

Uso esto tanto que lo aliasé a solo f, pero también puedes usar el más extenso format. por ejemplo, 'Hello {0}!'.format(name)

Respuesta #3

Muchas de las funciones anteriores (excepto la de Julian Jelfs) contienen el siguiente error:

js> '{0} {0} {1} {2}'.format(3.14, 'a{2}bc', 'foo');
3.14 3.14 afoobc foo

O, para las variantes que cuentan hacia atrás desde el final de la lista de argumentos:

js> '{0} {0} {1} {2}'.format(3.14, 'a{0}bc', 'foo');
3.14 3.14 a3.14bc foo

Aquí hay una función correcta. Es una variante prototípica del código de Julian Jelfs, que hice un poco más ajustada:

String.prototype.format = function () {
  var args = arguments;
  return this.replace(/\{(\d+)\}/g, function (m, n) { return args[n]; });
};

Y aquí hay una versión un poco más avanzada de lo mismo, que te permite escapar llaves duplicándolas:

String.prototype.format = function () {
  var args = arguments;
  return this.replace(/\{\{|\}\}|\{(\d+)\}/g, function (m, n) {
    if (m == "{{") { return "{"; }
    if (m == "}}") { return "}"; }
    return args[n];
  });
};

Esto funciona correctamente:

js> '{0} {{0}} {{{0}}} {1} {2}'.format(3.14, 'a{2}bc', 'foo');
3.14 {0} {3.14} a{2}bc foo

Aquí hay otra buena implementación de Blair Mitchelmore, con un montón de funciones adicionales agradables: https://web.archive.org/web/20120315214858/http://blairmitchelmore.com/javascript/string.format

Respuesta #4

Creé una función de formato que toma una colección o un arreglo como argumentos

Uso :

format("i can speak {language} since i was {age}",{language:'javascript',age:10});

format("i can speak {0} since i was {1}",'javascript',10});

Código :

var format = function (str, col) {
    col = typeof col === 'object' ? col : Array.prototype.slice.call(arguments, 1);

    return str.replace(/\{\{|\}\}|\{(\w+)\}/g, function (m, n) {
        if (m == "{{") { return "{"; }
        if (m == "}}") { return "}"; }
        return col[n];
    });
};

Respuesta #5

Hay una opción (en cierta medida) oficial: jQuery.validator.format.

Viene con el Plugin de Validación de jQuery 1.6 (al menos).
Bastante similar al String.Format que se encuentra en .NET.

Editar Se corrigió el enlace roto.

Respuesta #6

Si estás usando el complemento de validación, puedes usar:

jQuery.validator.format("{0} {1}", "cool", "formatting") = 'cool formatting'

http://docs.jquery.com/Plugins/Validation/jQuery.validator.format#templateargumentargumentN...

Respuesta #7

Aunque no es exactamente lo que la Q estaba pidiendo, he construido uno que es similar pero usa marcadores de posición con nombre en lugar de numerados. Personalmente prefiero tener argumentos con nombre y simplemente enviar un objeto como argumento (más detallado, pero más fácil de mantener).

String.prototype.format = function (args) {
    var newStr = this;
    for (var key in args) {
        newStr = newStr.replace('{' + key + '}', args[key]);
    }
    return newStr;
}

Aquí hay un ejemplo de uso...

alert("Hello {name}".format({ name: 'World' }));

Respuesta #8

Usando un navegador moderno, que soporte EcmaScript 2015 (ES6), puedes disfrutar de Plantillas de Cadenas. En lugar de formatear, puedes inyectar directamente el valor de la variable en ella:

var name = "Waleed";
var message = `Hello ${name}!`;

Tenga en cuenta que la cadena de la plantilla debe escribirse usando comillas invertidas (`).

Artículos relacionados