Je recherche un bon équivalent JavaScript du C / PHP printf()
ou des programmeurs C # / Java String.Format()
( IFormatProvider
pour .NET).
Ma condition de base est un format de mille séparateurs pour les nombres pour l'instant, mais quelque chose qui gère beaucoup de combinaisons (y compris les dates) serait bien.
Je me rends compte que la bibliothèque Ajax de Microsoft fournit une version de String.Format()
, mais nous ne voulons pas l'intégralité des frais généraux de ce cadre.
javascript
printf
string.format
Chris S
la source
la source
Réponses:
À partir d'ES6, vous pouvez utiliser des chaînes de modèle:
Voir la réponse de Kim ci-dessous pour plus de détails.
Autrement:
Essayez sprintf () pour JavaScript .
Si vous voulez vraiment faire vous-même une méthode de formatage simple, ne faites pas les remplacements successivement mais faites-les simultanément.
Parce que la plupart des autres propositions mentionnées échouent lorsqu'une chaîne de remplacement du remplacement précédent contient également une séquence de format comme celle-ci:
Normalement, vous vous attendez à ce que la sortie soit,
{1}{0}
mais la sortie réelle l'est{1}{1}
. Faites donc un remplacement simultanément à la place comme dans la suggestion de fearphage .la source
num.toFixed()
méthode pourrait être suffisante!sprintf() for JavaScript
n'était pas disponible.underscore.string
a plus de fonctionnalités en dehors de sprintf qui est basé sur lasprintf() for JavaScript
mise en œuvre. A part cela, la bibliothèque est un projet entièrement différent.S'appuyant sur les solutions précédemment suggérées:
"{0} is dead, but {1} is alive! {0} {2}".format("ASP", "ASP.NET")
les sorties
Si vous préférez ne pas modifier
String
le prototype de:Vous donne le plus familier:
String.format('{0} is dead, but {1} is alive! {0} {2}', 'ASP', 'ASP.NET');
avec le même résultat:
la source
+
opérateur-), assurez-vous de mettre la chaîne complète entre parenthèses:("asd {0}"+"fas {1}").format("first", "second");
sinon, la fonction ne sera appliquée qu'à la dernière chaîne ajoutée.'foo {0}'.format(fnWithNoReturnValue())
. Il reviendrait actuellementfoo {0}
. Avec vos changements, cela reviendraitfoo undefined
.C'est drôle parce que Stack Overflow a en fait sa propre fonction de formatage pour le
String
prototype appeléformatUnicorn
. Essayez! Allez dans la console et tapez quelque chose comme:Vous obtenez cette sortie:
Hello, Gabriel, are you feeling OK?
Vous pouvez utiliser des objets, des tableaux et des chaînes comme arguments! J'ai obtenu son code et l'ai retravaillé pour produire une nouvelle version de
String.prototype.format
:Notez l'
Array.prototype.slice.call(arguments)
appel intelligent - cela signifie que si vous jetez des arguments qui sont des chaînes ou des nombres, pas un seul objet de style JSON, vous obtenez leString.Format
comportement de C # presque exactement.En effet
Array
, les caractèresslice
forceront tout ce qui se trouvearguments
dans unArray
, que ce soit à l'origine ou non, et lekey
sera l'index (0, 1, 2 ...) de chaque élément du tableau contraint dans une chaîne (par exemple, "0", donc"\\{0\\}"
pour votre premier modèle d'expression rationnelle).Soigné.
la source
g
), qui peut remplacer la même clé plus d'une fois. Dans l'exemple ci-dessus, vous pouvez utiliser{name}
plusieurs fois dans la même phrase et les faire remplacer tous.name
est"blah {adjective} blah"
?Formatage des nombres en JavaScript
Je suis arrivé à cette page de questions en espérant trouver comment formater les nombres en JavaScript, sans introduire encore une autre bibliothèque. Voici ce que j'ai trouvé:
Arrondir les nombres à virgule flottante
L'équivalent de
sprintf("%.2f", num)
JavaScript semble êtrenum.toFixed(2)
, qui formatenum
à 2 décimales, avec arrondi (mais voir le commentaire de @ ars265 à proposMath.round
ci-dessous).Forme exponentielle
L'équivalent de
sprintf("%.2e", num)
isnum.toExponential(2)
.Bases hexadécimales et autres
Pour imprimer des nombres en base B, essayez
num.toString(B)
. JavaScript prend en charge la conversion automatique vers et depuis les bases 2 à 36 (en outre, certains navigateurs ont une prise en charge limitée du codage base64 ).Pages de référence
Tutoriel rapide sur le formatage des numéros JS
Page de référence Mozilla pour toFixed () (avec des liens vers toPrecision (), toExponential (), toLocaleString (), ...)
la source
..
fonctionne également:33333..toExponential(2);
À partir d'ES6, vous pouvez utiliser des chaînes de modèle :
Sachez que les chaînes de modèle sont entourées de guillemets `au lieu de (simples) guillemets.
Pour plus d'informations:
https://developers.google.com/web/updates/2015/01/ES6-Template-Strings
https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/template_strings
Remarque: consultez le site mozilla pour trouver une liste des navigateurs pris en charge.
la source
const compile = (x, y) => `I can call this template string whenever I want.. x=${x}, y=${y}`
...compile(30, 20)
jsxt, Zippo
Cette option convient mieux.
Avec cette option, je peux remplacer des chaînes comme celles-ci:
Avec votre code, le deuxième {0} ne serait pas remplacé. ;)
la source
J'utilise cette fonction simple:
C'est très similaire à string.format:
la source
+=
?, devrait-ilformatted = this.replace("{" + arg + "}", arguments[arg]);
for...in
ne fonctionnera pas dans tous les navigateurs comme ce code s'y attend. Il bouclera sur toutes les propriétés énumérables, qui dans certains navigateurs inclurontarguments.length
, et dans d'autres n'incluront même pas les arguments eux-mêmes. Dans tous les cas, siObject.prototype
est ajouté à, tous les ajouts seront probablement inclus dans le groupe. Le code devrait utiliser unefor
boucle standard plutôt quefor...in
."{0} is dead, but {1} is alive!".format("{1}", "ASP.NET") === "ASP.NET is dead, but ASP.NET is alive!"
arg
est globale. Vous devez le faire à la place:for (var arg in arguments) {
Pour les utilisateurs de Node.js , il existe une
util.format
fonctionnalité semblable à printf:la source
%-20s %5.2f
)Je suis surpris que personne ne l'ait utilisé
reduce
, il s'agit d'une fonction JavaScript concise et puissante native.ES6 (EcmaScript2015)
<ES6
Comment ça fonctionne:
la source
printf
fonction simplifiée : jsfiddle.net/11szrbx9(...a) => {return a.reduce((p: string, c: any) => p.replace(/%s/, c));
String.prototype.format
ES6:((a,b,c)=>`${a}, ${b} and ${c}`)(...['me', 'myself', 'I'])
(notez que c'est un peu redondant pour mieux s'adapter à votre exemple)printf
spécificateurs de type et inclure une logique pour les préfixes de remplissage. Itérer sur la chaîne de format d'une manière sensée semble être le défi mineur ici, à mon humble avis. Une solution intéressante si vous n'avez besoin que de remplacements de chaînes.Voici une implémentation minimale de sprintf en JavaScript: il ne fait que "% s" et "% d", mais j'ai laissé de l'espace pour qu'il soit étendu. Il est inutile pour l'OP, mais d'autres personnes qui tombent sur ce fil venant de Google pourraient en bénéficier.
Exemple:
Contrairement à des solutions similaires dans les réponses précédentes, celle-ci effectue toutes les substitutions en une seule fois , elle ne remplacera donc pas les parties des valeurs précédemment remplacées.
la source
Les programmeurs JavaScript peuvent utiliser String.prototype.sprintf à https://github.com/ildar-shaimordanov/jsxt/blob/master/js/String.js . Voici un exemple:
la source
Pour ajouter à
zippoxer
la réponse, j'utilise cette fonction:J'ai également une version non prototype que j'utilise plus souvent pour sa syntaxe de type Java:
Mise à jour ES 2015
Tous les nouveaux trucs sympas d'ES 2015 rendent cela beaucoup plus facile:
Je me suis dit que comme cela, comme les plus anciens, n'analysait pas réellement les lettres, il pourrait tout aussi bien utiliser un seul jeton
%%
. Cela a l'avantage d'être évident et de ne pas rendre difficile l'utilisation d'un seul%
. Cependant, si vous en avez besoin%%
pour une raison quelconque, vous devrez le remplacer par lui-même:la source
+1 Zippo à l'exception que le corps de la fonction doit être comme ci-dessous ou sinon il ajoute la chaîne actuelle à chaque itération:
la source
'The {0} is dead. Don\'t code {0}. Code {1} that is open source!'.format('ASP', 'PHP');
du résultatThe ASP is dead. Don't code {0}. Code PHP that is open source!
. Une dernière chosefor(arg in arguments)
ne fonctionne pas dans IE. j'ai remplacé parfor (arg = 0; arg <arguments.length; arg++)
for...in
ne fonctionnera pas dans tous les navigateurs comme ce code s'y attend. Il bouclera sur toutes les propriétés énumérables, qui dans certains navigateurs inclurontarguments.length
, et dans d'autres n'incluront même pas les arguments eux-mêmes. Dans tous les cas, siObject.prototype
est ajouté à, tous les ajouts seront probablement inclus dans le groupe. Le code devrait utiliser unefor
boucle standard plutôt quefor...in
.Je veux partager ma solution pour le «problème». Je n'ai pas réinventé la roue mais essaie de trouver une solution basée sur ce que JavaScript fait déjà. L'avantage est que vous obtenez gratuitement toutes les conversions implicites. La définition de la propriété prototype $ of String donne une syntaxe très agréable et compacte (voir les exemples ci-dessous). Ce n'est peut-être pas le moyen le plus efficace, mais dans la plupart des cas, la sortie n'a pas besoin d'être super optimisée.
Voici quelques exemples:
la source
Je vais ajouter mes propres découvertes que j'ai trouvées depuis que j'ai demandé:
Malheureusement, il semble que sprintf ne gère pas le formatage des milliers de séparateurs comme le format de chaîne .NET.
la source
J'utilise une petite bibliothèque appelée String.format pour JavaScript qui prend en charge la plupart des capacités de chaîne de format (y compris le format des nombres et des dates) et utilise la syntaxe .NET. Le script lui-même est inférieur à 4 Ko, il ne crée donc pas beaucoup de surcharge.
la source
Très élégant:
Le crédit va à
(lien brisé)https://gist.github.com/0i0/1519811la source
{{0}}
ainsi que des choses comme{0}{1}.format("{1}", "{0}")
. Devrait être au sommet!Si vous cherchez à gérer le séparateur des milliers, vous devez vraiment utiliser toLocaleString () de la classe JavaScript Number car il formatera la chaîne pour la région de l'utilisateur.
La classe JavaScript Date peut formater des dates et heures localisées.
la source
Le projet PHPJS a écrit des implémentations JavaScript pour de nombreuses fonctions de PHP. Étant donné que la
sprintf()
fonction de PHP est fondamentalement la même que celle de Cprintf()
, leur implémentation JavaScript devrait satisfaire vos besoins.la source
J'utilise celui-ci:
Alors je l'appelle:
la source
J'ai une solution très proche de celle de Peter, mais elle concerne le nombre et le cas d'objet.
Il serait peut-être encore mieux de traiter les cas de tous les fonds, mais pour mes besoins, c'est très bien.
PS: Cette fonction est très cool si vous utilisez des traductions dans des frameworks de modèles comme AngularJS :
Où le en.json est quelque chose comme
la source
Une version très légèrement différente, celle que je préfère (celle-ci utilise des jetons {xxx} plutôt que des arguments numérotés {0}, c'est beaucoup plus auto-documenté et convient beaucoup mieux à la localisation):
Une variation serait:
qui appelle d'abord une fonction de localisation l ().
la source
Il existe "sprintf" pour JavaScript que vous pouvez trouver sur http://www.webtoolkit.info/javascript-sprintf.html .
la source
Pour ceux qui aiment Node.JS et sa
util.format
fonctionnalité, je viens de l'extraire dans sa forme JavaScript vanille (avec uniquement des fonctions utilisées par util.format):Récolté sur: https://github.com/joyent/node/blob/master/lib/util.js
la source
Pour le formatage de base:
la source
J'ai un formateur légèrement plus long pour JavaScript ici ...
Vous pouvez effectuer le formatage de plusieurs manières:
String.format(input, args0, arg1, ...)
String.format(input, obj)
"literal".format(arg0, arg1, ...)
"literal".format(obj)
De plus, si vous avez dit un ObjectBase.prototype.format (comme avec DateJS ), il l'utilisera.
Exemples...
J'ai également un alias avec .asFormat et j'ai une détection en place au cas où il y aurait déjà un string.format (comme avec MS Ajax Toolkit (je déteste cette bibliothèque).
la source
Juste au cas où quelqu'un aurait besoin d'une fonction pour empêcher une portée mondiale polluante, voici la fonction qui fait de même:
la source
Nous pouvons utiliser une bibliothèque d'opérations de chaîne String.Format simple et légère pour Typescript .
String.Format ():
Format de chaîne pour les spécificateurs:
Format de chaîne pour les objets, y compris les spécificateurs:
la source
Je n'ai pas vu la
String.format
variante:la source
À utiliser avec les fonctions de réussite jQuery.ajax (). Passez un seul argument et remplacez la chaîne par les propriétés de cet objet en tant que {propertyName}:
Exemple:
la source