Python a cette belle fonction pour transformer ceci:
bar1 = 'foobar'
bar2 = 'jumped'
bar3 = 'dog'
foo = 'The lazy ' + bar3 + ' ' + bar2 ' over the ' + bar1
# The lazy dog jumped over the foobar
Dans ceci:
bar1 = 'foobar'
bar2 = 'jumped'
bar3 = 'dog'
foo = 'The lazy {} {} over the {}'.format(bar3, bar2, bar1)
# The lazy dog jumped over the foobar
JavaScript a-t-il une telle fonction? Sinon, comment pourrais-je en créer un qui respecte la même syntaxe que celle de Python?
Une autre approche, utilisant la méthode String.prototype.replace
, avec une fonction "replacer" comme second argument:
String.prototype.format = function () {
var i = 0, args = arguments;
return this.replace(/{}/g, function () {
return typeof args[i] != 'undefined' ? args[i++] : '';
});
};
var bar1 = 'foobar',
bar2 = 'jumped',
bar3 = 'dog';
'The lazy {} {} over the {}'.format(bar3, bar2, bar1);
// "The lazy dog jumped over the foobar"
Il existe un moyen, mais pas exactement en utilisant le format.
var name = "John";
var age = 19;
var message = `My name is ${name} and I am ${age} years old`;
console.log(message);
jsfiddle - link
A la recherche d'une réponse à la même question, je viens de trouver ceci: https://github.com/davidchambers/string-format , qui est "Le formatage de chaîne JavaScript inspiré de la fonction str.format()
de Python". Il semble que ce soit à peu près la même chose que la fonction format()
de python.
Tiré de la bibliothèque de YAHOOs:
YAHOO.Tools.printf = function() {
var num = arguments.length;
var oStr = arguments[0];
for (var i = 1; i < num; i++) {
var pattern = "\\{" + (i-1) + "\\}";
var re = new RegExp(pattern, "g");
oStr = oStr.replace(re, arguments[i]);
}
return oStr;
}
Appelez ça comme:
bar1 = 'foobar'
bar2 = 'jumped'
bar3 = 'dog'
foo = YAHOO.Tools.printf('The lazy {0} {1} over the {2}', bar3, bar2, bar1);
Voici ma première tentative. N'hésitez pas à signaler les défauts.
Exemple: http://jsfiddle.net/wFb2p/5/
String.prototype.format = function() {
var str = this;
var i = 0;
var len = arguments.length;
var matches = str.match(/{}/g);
if( !matches || matches.length !== len ) {
throw "wrong number of arguments";
}
while( i < len ) {
str = str.replace(/{}/, arguments[i] );
i++;
}
return str;
};
EDIT: Rendez-le un peu plus efficace en éliminant l'appel .match()
dans l'instruction while
.
EDIT: modifié pour que la même erreur soit renvoyée si vous ne transmettez aucun argument.
foo = (a, b, c) => `The lazy ${a} ${b} over the ${c}`
ES6 template strings fournit une fonctionnalité assez similaire au format de chaîne pythons. Cependant, vous devez connaître les variables avant de construire la chaîne:
var templateString = `The lazy ${bar3} ${bar2} over the ${bar1}`;
str.format
de Python vous permet de spécifier la chaîne before vous savez même quelles valeurs vous souhaitez y insérer, comme par exemple:
foo = 'The lazy {} {} over the {}'
bar1 = 'foobar'
bar2 = 'jumped'
bar3 = 'dog'
foo.format(bar3, bar2, bar1)
Avec une fonction flèche , nous pouvons envelopper élégamment la chaîne de modèle pour une utilisation ultérieure:
foo = (a, b, c) => `The lazy ${a} ${b} over the ${c}`
bar1 = 'foobar';
bar2 = 'jumped';
bar3 = 'dog';
foo(bar3, bar2, bar1)
Bien sûr, cela fonctionne aussi avec une fonction régulière, mais la fonction flèche nous permet d’en faire une ligne. Les deux fonctionnalités sont disponibles dans la plupart des navigateurs et des runtimes:
Usando divisé:
String.prototype.format = function (args) {
var text = this
for(var attr in args){
text = text.split('${' + attr + '}').join(args[attr]);
}
return text
};
json = {'who':'Gendry', 'what':'will sit', 'where':'in the Iron Throne'}
text = 'GOT: ${who} ${what} ${where}';
console.log('context: ',json);
console.log('template: ',text);
console.log('formated: ',text.format(json));
Usando Regex:
String.prototype.format = function (args) {
var text = this
for(var attr in args){
var rgx = new RegExp('${' + attr + '}','g');
text = text.replace(rgx, args[attr]);
}
return text
};
json = {'who':'Gendry', 'what':'will sit', 'where':'in the Iron Throne'}
text = 'GOT: ${who} ${what} ${where}';
console.log('context: ',json);
console.log('template: ',text);
console.log('formated: ',text.format(json));
JS:
String.prototype.format = function () {
var str = this;
for (var i = 0; i < arguments.length; i++) {
str = str.replace('{' + i + '}', arguments[i]);
}
return str;
}
bar1 = 'foobar';
bar2 = 'jumped';
bar3 = 'dog';
python_format = 'The lazy {2} {1} over the {0}'.format(bar1,bar2,bar3);
document.getElementById("demo").innerHTML = "JavaScript equivalent of Python's format() function:<br><span id='python_str'>" + python_format + "</span>";
HTML:
<p id="demo"></p>
CSS:
span#python_str {
color: red;
font-style: italic;
}
SORTIE:
Équivalent JavaScript de la fonction format () de Python:
Le chien paresseux a sauté par-dessus la foobar
DEMO:
Ce code vous permet de spécifier exactement quels crochets remplacer par quelles chaînes. Les crochets n'ont pas besoin d'être dans le même ordre que les arguments, et plusieurs crochets sont possibles. La fonction format prend comme paramètre un tableau de valeurs, chaque clé étant l'une des "variables" entre crochets qui est remplacée par la valeur correspondante.
String.prototype.format = function (arguments) {
var this_string = '';
for (var char_pos = 0; char_pos < this.length; char_pos++) {
this_string = this_string + this[char_pos];
}
for (var key in arguments) {
var string_key = '{' + key + '}'
this_string = this_string.replace(new RegExp(string_key, 'g'), arguments[key]);
}
return this_string;
};
'The time is {time} and today is {day}, {day}, {day}. Oh, and did I mention that the time is {time}.'.format({day:'Monday',time:'2:13'});
//'The time is 2:13 and today is Monday, Monday, Monday. Oh, and did I mention that the time is 2:13.'
Dans le fichier
https://github.com/BruceSherwood/glowscript/blob/master/lib/glow/api_misc.js
est une fonction String.prototype.format = function (args) qui implémente pleinement la fonction Python string.format (), sans se limiter à la gestion des chaînes de caractères.
JavaScript n'a pas une telle fonction autant que je sache.
Vous pouvez en créer un en modifiant l'objet prototype de la classe String afin d'ajouter une méthode format () prenant un nombre variable d'arguments.
Dans la méthode de formatage, vous devez obtenir la valeur d'instance de String (la chaîne réelle), puis l'analyser pour "{}" et insérer l'argument approprié.
Renvoyez ensuite la nouvelle chaîne à l'appelant.
JavaScript n'a pas de fonction de formatage de chaîne par défaut, bien que vous puissiez créer votre propre ou utiliser celui que quelqu'un d'autre a créé (comme sprintf )
Pour ceux qui recherchent une solution simple ES6.
Tout d'abord, je fournis une fonction au lieu d'étendre le prototype natif de String, car il est généralement déconseillé.
// format function using replace() and recursion
const format = (str, arr) => arr.length > 1
? format(str.replace('{}', arr[0]), arr.slice(1))
: (arr[0] && str.replace('{}', arr[0])) || str
// Example usage
const str1 = 'The {} brown {} jumps over the {} dog'
const formattedString = formatFn(str1, ['quick','fox','lazy'])
console.log(formattedString)