Equivalente de String.format en jQuery

Resuelto Waleed Eissa asked hace 15 años • 22 respuestas

Estoy intentando mover un código JavaScript de MicrosoftAjax a JQuery. Utilizo los equivalentes de JavaScript en MicrosoftAjax de los métodos .net populares, por ejemplo, String.format(), String.startsWith(), etc. ¿Existen equivalentes en jQuery?

Waleed Eissa avatar Jun 24 '09 21:06 Waleed Eissa
Aceptado

El código fuente de ASP.NET AJAX está disponible para su referencia, por lo que puede seleccionarlo e incluir las partes que desea seguir usando en un archivo JS separado. O puede transferirlos 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 de termina con y comienza con...

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);
}
Josh Stodola avatar Jun 24 '2009 15:06 Josh Stodola

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

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) 

Lo uso tanto que le puse el alias just f, pero también puedes usar el más detallado format. p.ej'Hello {0}!'.format(name)

adamJLev avatar Apr 15 '2010 19:04 adamJLev

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 estricto:

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 la misma, que le permite escapar de las 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 características adicionales interesantes: https://web.archive.org/web/20120315214858/http://blairmitchelmore.com/javascript/string.format

gpvos avatar Feb 22 '2011 10:02 gpvos

Creó una función de formato que toma una colección o una matriz 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];
    });
};
ianj avatar Mar 17 '2011 16:03 ianj