web-dev-qa-db-fra.com

Équivalent JavaScript de la fonction format () de Python?

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?

35
Blender

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"
38
CMS

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

20
Yash Mehrotra

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.

9
Tomáš Diviš

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); 
5
PatrikAkerstrand

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.

4
user113716

tl; dr

foo = (a, b, c) => `The lazy ${a} ${b} over the ${c}`

Pourquoi les chaînes de modèles ne suffisent pas

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}`;

Pourquoi formater?

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)

Solution

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: 

3
Cornflex

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));
2
Roque Viana

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:

jsFiddle

1
Riccardo Volpe

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.'
1
James Porter

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.

0
user1114907

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.

0
typo.pl

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 )

0
zzzzBov

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)

0
Emmanuel N K