Estoy buscando un buen equivalente de JavaScript de C / PHP printf()
o para programadores de C # / Java String.Format()
( IFormatProvider
para .NET).
Mi requisito básico es un formato de mil separadores para números por ahora, pero algo que maneje muchas combinaciones (incluidas las fechas) sería bueno.
Me doy cuenta de que la biblioteca Ajax de Microsoft proporciona una versión de String.Format()
, pero no queremos toda la sobrecarga de ese marco.
javascript
printf
string.format
Chris S
fuente
fuente
Respuestas:
A partir de ES6, puede usar cadenas de plantilla:
Vea la respuesta de Kim a continuación para más detalles.
De otra manera:
Prueba sprintf () para JavaScript .
Si realmente quiere hacer un método de formato simple por su cuenta, no haga los reemplazos sucesivamente, sino que los haga simultáneamente.
Debido a que la mayoría de las otras propuestas que se mencionan fallan cuando una cadena de reemplazo anterior también contiene una secuencia de formato como esta:
Normalmente esperaría que la salida fuera
{1}{0}
pero la salida real es{1}{1}
. Entonces, haga un reemplazo simultáneo, como en la sugerencia de miedo .fuente
num.toFixed()
método podría ser suficiente!sprintf() for JavaScript
no estaba disponible.underscore.string
tiene más características además de sprintf que se basa en lasprintf() for JavaScript
implementación. Aparte de eso, la biblioteca es un proyecto completamente diferente.Sobre la base de las soluciones sugeridas anteriormente:
"{0} is dead, but {1} is alive! {0} {2}".format("ASP", "ASP.NET")
salidas
Si prefiere no modificar
String
el prototipo:Te da el mucho más familiar:
String.format('{0} is dead, but {1} is alive! {0} {2}', 'ASP', 'ASP.NET');
con el mismo resultado:
fuente
+
operador), asegúrese de poner la cadena completa entre paréntesis: de lo("asd {0}"+"fas {1}").format("first", "second");
contrario, la función solo se aplicará a la última cadena que se agregó.'foo {0}'.format(fnWithNoReturnValue())
. Actualmente volveríafoo {0}
. Con sus cambios, volveríafoo undefined
.Es divertido porque Stack Overflow tiene su propia función de formateo para el
String
prototipo llamadoformatUnicorn
. ¡Intentalo! Entra en la consola y escribe algo como:Obtienes esta salida:
Hello, Gabriel, are you feeling OK?
¡Puedes usar objetos, matrices y cadenas como argumentos! Obtuve su código y lo reformulé para producir una nueva versión de
String.prototype.format
:Tenga en cuenta la
Array.prototype.slice.call(arguments)
llamada inteligente : eso significa que si agrega argumentos que son cadenas o números, no un solo objeto de estilo JSON, obtendrá elString.Format
comportamiento de C # casi exactamente.Esto se debe a
Array
'sslice
obligarán lo que esté enarguments
en unaArray
, ya sea en su origen fue o no, y elkey
será el índice (0, 1, 2 ...) de cada elemento de la matriz forzada a tener una cadena (por ejemplo, '0', por lo"\\{0\\}"
para tu primer patrón regexp).Ordenado.
fuente
g
), que puede reemplazar la misma clave más de una vez. En el ejemplo anterior, podría usar{name}
varias veces en la misma oración y reemplazarlas todas.name
es así"blah {adjective} blah"
?Formato de número en JavaScript
Llegué a esta página de preguntas con la esperanza de encontrar cómo formatear números en JavaScript, sin presentar otra biblioteca. Esto es lo que he encontrado:
Redondeo de números de coma flotante
sprintf("%.2f", num)
Parece ser el equivalente de en JavaScriptnum.toFixed(2)
, que se formateanum
a 2 decimales, con redondeo (pero vea el comentario de @ ars265 aMath.round
continuación).Forma exponencial
El equivalente de
sprintf("%.2e", num)
esnum.toExponential(2)
.Hexadecimales y otras bases.
Para imprimir números en la base B, intente
num.toString(B)
. JavaScript admite la conversión automática hacia y desde las bases 2 a 36 (además, algunos navegadores tienen soporte limitado para la codificación base64 ).Páginas de referencia
Tutorial rápido sobre formato de número JS
Página de referencia de Mozilla para toFixed () (con enlaces a toPrecision (), toExponential (), toLocaleString (), ...)
fuente
..
también funciona:33333..toExponential(2);
A partir de ES6, puede usar cadenas de plantilla :
Tenga en cuenta que las cadenas de plantilla están rodeadas por comillas invertidas comillas `en lugar de comillas (simples).
Para mayor información:
https://developers.google.com/web/updates/2015/01/ES6-Template-Strings
https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/template_strings
Nota: Consulte el sitio de mozilla para encontrar una lista de navegadores compatibles.
fuente
const compile = (x, y) => `I can call this template string whenever I want.. x=${x}, y=${y}`
...compile(30, 20)
jsxt, Zippo
Esta opción se ajusta mejor.
Con esta opción puedo reemplazar cadenas como estas:
Con su código, el segundo {0} no sería reemplazado. ;)
fuente
Yo uso esta simple función:
Eso es muy similar a string.format:
fuente
+=
Por qué ?, ¿debería?formatted = this.replace("{" + arg + "}", arguments[arg]);
for...in
no funcionará en todos los navegadores ya que este código lo espera. Recorrerá todas las propiedades enumerables, que en algunos navegadores incluiránarguments.length
, y en otros ni siquiera incluirán los argumentos. En cualquier caso, siObject.prototype
se agrega a, las adiciones probablemente se incluirán en el grupo. El código debe usar unfor
bucle estándar , en lugar defor...in
."{0} is dead, but {1} is alive!".format("{1}", "ASP.NET") === "ASP.NET is dead, but ASP.NET is alive!"
arg
es global. En su lugar, debe hacer esto:for (var arg in arguments) {
Para los usuarios de Node.js existe la
util.format
que tiene una funcionalidad similar a printf:fuente
%-20s %5.2f
. Ej. )Me sorprende que nadie lo haya usado
reduce
, esta es una función nativa, concisa y poderosa de JavaScript.ES6 (EcmaScript2015)
<ES6
Cómo funciona:
fuente
printf
función simplificada : jsfiddle.net/11szrbx9(...a) => {return a.reduce((p: string, c: any) => p.replace(/%s/, c));
String.prototype.format
en ES6:((a,b,c)=>`${a}, ${b} and ${c}`)(...['me', 'myself', 'I'])
(tenga en cuenta que esto es un poco redundante para adaptarse mejor a su ejemplo)printf
los especificadores de tipo e incluir lógica para los prefijos de relleno. Iterar sobre la cadena de formato de manera sensata parece ser el desafío menor aquí, en mi humilde opinión. Sin embargo, una solución ordenada si solo necesita reemplazos de cadenas.Aquí hay una implementación mínima de sprintf en JavaScript: solo hace "% s" y "% d", pero he dejado espacio para que se extienda. Es inútil para el OP, pero otras personas que se topan con este hilo proveniente de Google podrían beneficiarse de él.
Ejemplo:
A diferencia de soluciones similares en respuestas anteriores, esta realiza todas las sustituciones de una vez , por lo que no reemplazará partes de valores reemplazados previamente.
fuente
Los programadores de JavaScript pueden usar String.prototype.sprintf en https://github.com/ildar-shaimordanov/jsxt/blob/master/js/String.js . A continuación se muestra un ejemplo:
fuente
Agregando a
zippoxer
la respuesta de, uso esta función:También tengo una versión no prototipo que uso con más frecuencia por su sintaxis tipo Java:
Actualización de ES 2015
Todas las novedades en ES 2015 hacen que esto sea mucho más fácil:
Pensé que, dado que esto, como los más antiguos, no analiza las letras, también podría usar un solo token
%%
. Esto tiene el beneficio de ser obvio y no dificultar el uso de uno solo%
. Sin embargo, si lo necesita%%
por algún motivo, deberá reemplazarlo por sí mismo:fuente
+1 Zippo con la excepción de que el cuerpo de la función debe ser el siguiente o, de lo contrario, agrega la cadena actual en cada iteración:
fuente
'The {0} is dead. Don\'t code {0}. Code {1} that is open source!'.format('ASP', 'PHP');
el que se convierte el resultadoThe ASP is dead. Don't code {0}. Code PHP that is open source!
. Una cosa másfor(arg in arguments)
no funciona en IE. Lo reemplacé confor (arg = 0; arg <arguments.length; arg++)
for...in
no funcionará en todos los navegadores ya que este código lo espera. Recorrerá todas las propiedades enumerables, que en algunos navegadores incluiránarguments.length
, y en otros ni siquiera incluirán los argumentos. En cualquier caso, siObject.prototype
se agrega a, cualquier agregado probablemente se incluirá en el grupo. El código debe usar unfor
bucle estándar , en lugar defor...in
.Quiero compartir mi solución para el 'problema'. No he reinventado la rueda, pero trato de encontrar una solución basada en lo que JavaScript ya hace. La ventaja es que obtienes todas las conversiones implícitas de forma gratuita. Establecer la propiedad prototipo $ de String proporciona una sintaxis muy agradable y compacta (ver ejemplos a continuación). Tal vez no sea la forma más eficiente, pero en la mayoría de los casos tratar con la salida no tiene que estar súper optimizado.
Aquí están algunos ejemplos:
fuente
Agregaré mis propios descubrimientos que he encontrado desde que pregunté:
Lamentablemente, parece que sprintf no maneja miles de formatos de separador como el formato de cadena de .NET.
fuente
Utilizo una pequeña biblioteca llamada String.format para JavaScript que admite la mayoría de las capacidades de cadena de formato (incluido el formato de números y fechas), y utiliza la sintaxis .NET. El script en sí es más pequeño que 4 kB, por lo que no crea mucha sobrecarga.
fuente
Muy elegante:
El crédito va a
(Enlace roto)https://gist.github.com/0i0/1519811fuente
{{0}}
, así como cosas similares{0}{1}.format("{1}", "{0}")
. Debería estar en la cima!Si está buscando manejar el separador de miles, realmente debería usar toLocaleString () de la clase de Número JavaScript ya que formateará la cadena para la región del usuario.
La clase de fecha de JavaScript puede formatear fechas y horas localizadas.
fuente
El proyecto PHPJS ha escrito implementaciones de JavaScript para muchas de las funciones de PHP. Dado que la
sprintf()
función de PHP es básicamente la misma que la de Cprintf()
, su implementación de JavaScript debería satisfacer sus necesidades.fuente
Yo uso este:
Entonces lo llamo:
fuente
Tengo una solución muy cercana a la de Peter, pero se trata de números y objetos.
Tal vez podría ser aún mejor tratar con todos los casos profundos, pero para mis necesidades esto está bien.
PD: esta función es muy buena si está utilizando traducciones en marcos de plantillas como AngularJS :
Donde el en.json es algo así
fuente
Una versión ligeramente diferente, la que prefiero (esta usa {xxx} tokens en lugar de {0} argumentos numerados, esto es mucho más autodocumentado y se adapta mucho mejor a la localización):
Una variación sería:
que llama primero a una función de localización l ().
fuente
Hay "sprintf" para JavaScript que puede encontrar en http://www.webtoolkit.info/javascript-sprintf.html .
fuente
Para aquellos a quienes les gusta Node.JS y su
util.format
característica, lo acabo de extraer en su formulario JavaScript vainilla (con solo funciones que utiliza util.format):Cosechado de: https://github.com/joyent/node/blob/master/lib/util.js
fuente
Para formateo básico:
fuente
Tengo un formateador un poco más largo para JavaScript aquí ...
Puede formatear de varias maneras:
String.format(input, args0, arg1, ...)
String.format(input, obj)
"literal".format(arg0, arg1, ...)
"literal".format(obj)
Además, si ha dicho un ObjectBase.prototype.format (como con DateJS ) lo usará.
Ejemplos ...
También me he alias con .asFormat y tengo algo de detección en caso de que ya haya un string.format (como con MS Ajax Toolkit (Odio esa biblioteca).
fuente
En caso de que alguien necesite una función para evitar contaminar el alcance global, aquí está la función que hace lo mismo:
fuente
Podemos usar una biblioteca simple de operación de cadenas String.Format ligera para Typecript .
String.Format ():
Formato de cadena para especificadores:
Formato de cadena para objetos que incluyen especificadores:
fuente
No vi la
String.format
variante:fuente
Para usar con las funciones de éxito jQuery.ajax (). Pase solo un argumento único y la cadena de reemplazo con las propiedades de ese objeto como {propertyName}:
Ejemplo:
fuente