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 (`).
