s = 'hello %s, how are you doing' % (my_name)
C'est comme ça que vous le faites en python. Comment pouvez-vous faire cela dans javascript / node.js?
s = 'hello %s, how are you doing' % (my_name)
C'est comme ça que vous le faites en python. Comment pouvez-vous faire cela dans javascript / node.js?
Réponses:
Si vous voulez avoir quelque chose de similaire, vous pouvez créer une fonction:
function parse(str) {
var args = [].slice.call(arguments, 1),
i = 0;
return str.replace(/%s/g, () => args[i++]);
}
Usage:
s = parse('hello %s, how are you doing', my_name);
Ceci n'est qu'un exemple simple et ne prend pas en compte les différents types de types de données (comme %i
, etc.) ou les échappements de %s
. Mais j'espère que cela vous donne une idée. Je suis presque sûr qu'il existe également des bibliothèques qui fournissent une fonction comme celle-ci.
Avec Node.js v4
, vous pouvez utiliser les chaînes de modèle d'ES6
var my_name = 'John';
var s = `hello ${my_name}, how are you doing`;
console.log(s); // prints hello John, how are you doing
Vous devez envelopper la chaîne dans le backtick `
au lieu de'
hello ${my_name}, how are you doing
et que je souhaite attribuer une variable dynamiquement après avoir lu la chaîne depuis la configuration?
si vous utilisez ES6, vous devez utiliser les littéraux de modèle.
//you can do this
let sentence = `My name is ${ user.name }. Nice to meet you.`
en savoir plus ici: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Template_literals
À partir de là, node.js
>4.0
il devient plus compatible avec la norme ES6, où la manipulation des chaînes s'est grandement améliorée.
La réponse à la question initiale peut être aussi simple que:
var s = `hello ${my_name}, how are you doing`;
// note: tilt ` instead of single quote '
Là où la chaîne peut s'étendre sur plusieurs lignes, elle facilite considérablement les modèles ou les processus HTML / XML. Plus de détails et plus de capacités à ce sujet: Les littéraux de modèle sont des littéraux de chaîne sur mozilla.org.
util.format fait cela.
Il fera partie de la v0.5.3 et peut être utilisé comme ceci:
var uri = util.format('http%s://%s%s',
(useSSL?'s':''), apiBase, path||'/');
Faites ça:
s = 'hello ' + my_name + ', how are you doing'
Avec ES6, vous pouvez également faire ceci:
s = `hello ${my_name}, how are you doing`
Quelques façons d'étendre String.prototype
ou d'utiliser des littéraux de modèle ES2015 .
var result = document.querySelector('#result');
// -----------------------------------------------------------------------------------
// Classic
String.prototype.format = String.prototype.format ||
function () {
var args = Array.prototype.slice.call(arguments);
var replacer = function (a){return args[a.substr(1)-1];};
return this.replace(/(\$\d+)/gm, replacer)
};
result.textContent =
'hello $1, $2'.format('[world]', '[how are you?]');
// ES2015#1
'use strict'
String.prototype.format2 = String.prototype.format2 ||
function(...merge) { return this.replace(/\$\d+/g, r => merge[r.slice(1)-1]); };
result.textContent += '\nHi there $1, $2'.format2('[sir]', '[I\'m fine, thnx]');
// ES2015#2: template literal
var merge = ['[good]', '[know]'];
result.textContent += `\nOk, ${merge[0]} to ${merge[1]}`;
<pre id="result"></pre>
Essayez sprintf dans JS ou vous pouvez utiliser l' essentiel
Si vous utilisez node.js, console.log () prend la chaîne de format comme premier paramètre:
console.log('count: %d', count);
console.log()
renvoie uniquement la chaîne formatée vers STDOUT
. En d'autres termes, vous ne pouvez pas utiliser le résultat decount: %d
const format = (...args) => args.shift().replace(/%([jsd])/g, x => x === '%j' ? JSON.stringify(args.shift()) : args.shift())
const name = 'Csaba'
const formatted = format('Hi %s, today is %s and your data is %j', name, Date(), {data: {country: 'Hungary', city: 'Budapest'}})
console.log(formatted)
J'ai écrit une fonction qui résout le problème avec précision.
Le premier argument est la chaîne qui voulait être paramétrée. Vous devriez mettre vos variables dans cette chaîne comme ce format "% s1,% s2, ...% s12" .
Les autres arguments sont respectivement les paramètres de cette chaîne.
/***
* @example parameterizedString("my name is %s1 and surname is %s2", "John", "Doe");
* @return "my name is John and surname is Doe"
*
* @firstArgument {String} like "my name is %s1 and surname is %s2"
* @otherArguments {String | Number}
* @returns {String}
*/
const parameterizedString = (...args) => {
const str = args[0];
const params = args.filter((arg, index) => index !== 0);
if (!str) return "";
return str.replace(/%s[0-9]+/g, matchedStr => {
const variableIndex = matchedStr.replace("%s", "") - 1;
return params[variableIndex];
});
}
Exemples
parameterizedString("my name is %s1 and surname is %s2", "John", "Doe");
// returns "my name is John and surname is Doe"
parameterizedString("this%s1 %s2 %s3", " method", "sooo", "goood");
// returns "this method sooo goood"
Si la position de la variable change dans cette chaîne, cette fonction la prend également en charge sans modifier les paramètres de la fonction.
parameterizedString("i have %s2 %s1 and %s4 %s3.", "books", 5, "pencils", "6");
// returns "i have 5 books and 6 pencils."
var user = "your name";
var s = 'hello ' + user + ', how are you doing';
Voici un exemple de littéral de chaîne multiligne dans Node.js.
> let name = 'Fred'
> tm = `Dear ${name},
... This is to inform you, ${name}, that you are
... IN VIOLATION of Penal Code 64.302-4.
... Surrender yourself IMMEDIATELY!
... THIS MEANS YOU, ${name}!!!
...
... `
'Dear Fred,\nThis is to inform you, Fred, that you are\nIN VIOLATION of Penal Code 64.302-4.\nSurrender yourself IMMEDIATELY!\nTHIS MEANS YOU, Fred!!!\n\n'
console.log(tm)
Dear Fred,
This is to inform you, Fred, that you are
IN VIOLATION of Penal Code 64.302-4.
Surrender yourself IMMEDIATELY!
THIS MEANS YOU, Fred!!!
undefined
>
var s = 'hello ${my_name}, how are you doing';