s = 'hello %s, how are you doing' % (my_name)
Así es como lo haces en python. ¿Cómo puedes hacer eso en javascript / node.js?
s = 'hello %s, how are you doing' % (my_name)
Así es como lo haces en python. ¿Cómo puedes hacer eso en javascript / node.js?
Respuestas:
Si quieres tener algo similar, puedes crear una función:
function parse(str) {
var args = [].slice.call(arguments, 1),
i = 0;
return str.replace(/%s/g, () => args[i++]);
}
Uso:
s = parse('hello %s, how are you doing', my_name);
Este es solo un ejemplo simple y no tiene en cuenta diferentes tipos de tipos de datos (como %i, etc.) o el escape de %s. Pero espero que te dé alguna idea. Estoy bastante seguro de que también hay bibliotecas que ofrecen una función como esta.
Con Node.js v4, puede usar las cadenas de plantilla de ES6
var my_name = 'John';
var s = `hello ${my_name}, how are you doing`;
console.log(s); // prints hello John, how are you doing
Necesita envolver la cadena dentro del backtick en `
lugar de'
hello ${my_name}, how are you doingy quiero asignar variables dinámicamente después de leer la cadena desde la configuración?
si está utilizando ES6, debe usar los literales de plantilla.
//you can do this
let sentence = `My name is ${ user.name }. Nice to meet you.`
Lea más aquí: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Template_literals
A medida que node.js >4.0se vuelve más compatible con el estándar ES6, donde la manipulación de cadenas mejoró considerablemente.
La respuesta a la pregunta original puede ser tan simple como:
var s = `hello ${my_name}, how are you doing`;
// note: tilt ` instead of single quote '
Cuando la cadena puede extender varias líneas, hace que las plantillas o los procesos HTML / XML sean bastante fáciles. Más detalles y más capacidad al respecto: los literales de plantilla son literales de cadena en mozilla.org.
util.format hace esto.
Será parte de v0.5.3 y se puede usar así:
var uri = util.format('http%s://%s%s',
(useSSL?'s':''), apiBase, path||'/');
Haz eso:
s = 'hello ' + my_name + ', how are you doing'
Con ES6, también podría hacer esto:
s = `hello ${my_name}, how are you doing`
Algunas formas de extender String.prototypeo usar los literales de plantilla 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>
Prueba sprintf en JS o podrías usar esta esencia
Si está utilizando node.js, console.log () toma la cadena de formato como primer parámetro:
console.log('count: %d', count);
console.log()solo envía la cadena formateada a STDOUT. En otras palabras, no puede usar el resultado 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)
Escribí una función que resuelve el problema con precisión.
El primer argumento es la cadena que quería ser parametrizada. Debe colocar sus variables en esta cadena como este formato "% s1,% s2, ...% s12" .
Otros argumentos son los parámetros respectivamente para esa cadena.
/***
* @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];
});
}
Ejemplos
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 posición variable cambia en esa cadena, esta función también la admite sin cambiar los parámetros de la función.
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';
Aquí hay un ejemplo literal de cadenas de varias líneas en 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';