C'est drôle parce que Stack Overflow a sa propre fonction de mise en forme pour le champ String
prototype appelé formatUnicorn
. Essayez-le ! Allez dans la console et tapez quelque chose comme :
"Hello, {name}, are you feeling {adjective}?".formatUnicorn({name:"Gabriel", adjective: "OK"});
Vous obtenez ce résultat :
Hello, Gabriel, are you feeling OK?
Vous pouvez utiliser des objets, des tableaux et des chaînes de caractères comme arguments ! J'ai récupéré son code et l'ai retravaillé pour produire une nouvelle version de String.prototype.format
:
String.prototype.formatUnicorn = String.prototype.formatUnicorn ||
function () {
"use strict";
var str = this.toString();
if (arguments.length) {
var t = typeof arguments[0];
var key;
var args = ("string" === t || "number" === t) ?
Array.prototype.slice.call(arguments)
: arguments[0];
for (key in args) {
str = str.replace(new RegExp("\\{" + key + "\\}", "gi"), args[key]);
}
}
return str;
};
Notez l'astuce Array.prototype.slice.call(arguments)
ce qui signifie que si vous introduisez des arguments qui sont des chaînes de caractères ou des nombres, et non pas un objet unique de style JSON, vous obtenez l'appel C# String.Format
comportement presque exactement.
"a{0}bcd{1}ef".formatUnicorn("FOO", "BAR"); // yields "aFOObcdBARef"
C'est parce que Array
's slice
va forcer ce qui est dans arguments
dans un Array
que ce soit à l'origine ou non, et la key
sera l'index (0, 1, 2...) de chaque élément du tableau converti en chaîne de caractères (par exemple, "0", donc "\\{0\\}"
pour votre premier motif regexp).
Neat.
4 votes
En dehors de toutes les bonnes réponses ci-dessous, vous voudrez peut-être jeter un coup d'œil à celle-ci : stackoverflow.com/a/2648463/1712065 ce qui, selon moi, est la solution la plus efficace à ce problème.
3 votes
J'ai écrit un bon marché qui utilise la syntaxe printf de type C.
0 votes
Var search = [$scope.dog, "1"] ; var url = vsprintf(" terre/Services/dogSearch.svc/FindMe/%s/%s ", search) ; ***Pour node, vous pouvez obtenir votre module par "npm install sprintf-js".
0 votes
J'ai également écrit une fonction simple pour y parvenir ; stackoverflow.com/a/54345052/5927126
0 votes
J'ai depuis publié une implémentation rapide et conforme aux spécifications de printf pour Node.js et les navigateurs. github.com/gajus/fast-printf
5 votes
La plupart des réponses ici sont décevantes. Printf et String.Format sont tous deux chemin et la question mentionne spécifiquement les séparateurs de milliers, qu'aucune des solutions de modélisation simple ne gère.