Des espaces réservés nommés dans la mise en forme de chaîne
En Python, lors de la mise en forme de chaîne, je peux remplir les espaces réservés par leur nom plutôt que par la poste, comme ça:
print "There's an incorrect value '%(value)s' in column # %(column)d" % \
{ 'value': x, 'column': y }
Je me demande si c'est possible en Java (je l'espère, sans bibliothèques externes)?
- Vous pouvez étendre MessageFormat et de mettre en œuvre la cartographie funtionality à partir de variables d'indices qui.
- Merci, je vais essayer ça.
- Voir StrSubstitutor - commons.apache.org/proper/commons-lang/javadocs/api-release/org/...
- Un peu d'histoire: Java surtout copié C/C++ sur ce sujet, comme elle a essayé de leurrer les développeurs à partir du C++ monde où
%s
était une pratique courante. en.wikipedia.org/wiki/Printf_format_string#History notez Aussi que certains IDE et FindBugs peut détecter automatiquement le décalage %s et %d compte, mais je préfère encore des champs nommés.
Vous devez vous connecter pour publier un commentaire.
StrSubstitutor de jakarta commons lang est un poids léger façon de faire cela à condition que vos valeurs sont déjà formatés correctement.
http://commons.apache.org/proper/commons-lang/javadocs/api-3.1/org/apache/commons/lang3/text/StrSubstitutor.html
Les résultats ci-dessus en:
"Il y a une mauvaise valeur" 1 "dans la colonne n ° 2"
Lors de l'utilisation de Maven, vous pouvez ajouter cette dépendance à votre pom.xml:
${arg}
) à la place de la coutume ci-dessus (%(arg)
) puis la regex ne compile pas, ce qui est l'effet désiré.pas tout à fait, mais vous pouvez utiliser MessageFormat pour faire référence à une valeur plusieurs fois:
Ci-dessus peut être fait avec de la Ficelle.format (), mais je trouve messageFormat syntaxe plus propre si vous avez besoin pour construire des expressions complexes, de plus, vous n'avez pas besoin de se soucier du type de l'objet que vous mettez dans la chaîne
MessageFormat
est grande, mais la lourdeur relativement grand contenu jsonjava.text.MessageFormat
et il n'est pas de la cartographie pour{0}
la moindre idée?Vous pouvez utiliser StringTemplate de la bibliothèque, il offre ce que vous voulez et beaucoup plus.
'
char:unexpected char: '''
Un autre exemple de Apache Commune StringSubstitutor pour de simples nommé espace réservé.
Pour des cas très simples vous pouvez simplement utiliser une Chaîne codée en dur à remplacer, pas besoin d'une bibliothèque:
AVERTISSEMENT: je voulais juste montrer le code le plus simple possible.
Bien sûr, NE PAS utiliser ce grave pour le code de production où les questions de sécurité, comme indiqué dans les commentaires: echappement, traitement des erreurs et de la sécurité sont un problème ici.
Mais dans le pire des cas, vous savez maintenant pourquoi l'utilisation d'un " bon " lib est nécessaire 🙂
Merci à tous pour votre aide! À l'aide de tous vos indices, j'ai écrit routine de faire exactement ce que je veux -- python-comme la mise en forme de chaîne à l'aide du dictionnaire. Depuis que je suis Java débutant, tous les conseils sont appréciés.
formatPos
ne peuvent pas contenir d'formatKey
.Exemple:
.replaceAll()
chaîne de substitution, les rappels.C'est un vieux thread, mais juste pour le record, vous pouvez également utiliser Java 8 style, comme ceci:
Utilisation:
La sortie sera:
.reduce()
traite intermédiaire de substitution résultats que les chaînes de format qui leur est propre, cette solution est vulnérable à la chaîne de format attaques. Toute solution correcte devrait faire un seul passage à travers la chaîne de format.Je suis l'auteur de une petite bibliothèque qui fait exactement ce que vous voulez:
Ou vous pouvez enchaîner les arguments:
Vous pourriez avoir quelque chose comme ça sur une chaîne de la classe helper
Ma réponse est:
a) utiliser StringBuilder lorsque cela est possible
b) garder (dans n'importe quelle forme: integer est le meilleur, speciall char comme le dollar macro etc) position de "paramètre", puis utiliser
StringBuilder.insert()
(quelques versions d'arguments).À l'aide de bibliothèques externes semble exagéré, et je trouve que dégrader les performances significatif, lorsque StringBuilder est converti en Chaîne à l'interne.
Basé sur la réponse j'ai créé
MapBuilder
classe:puis j'ai créé la classe
StringFormat
pour la mise en forme de Chaîne:que vous pourriez utiliser comme ça:
Apache Commons Lang replaceEach méthode peut venir dans maniable dependeding sur vos besoins spécifiques. Vous pouvez facilement l'utiliser pour remplacer les espaces par un nom avec cette méthode unique d'appel:
Compte tenu de certains de saisie de texte, ce sera de remplacer toutes les occurrences de l'espace réservé à la première chaîne de tableau avec les valeurs correspondantes dans le second.
J'ai créé aussi un util/classe d'assistance (à l'aide du jdk 8), ce qui permet de formater une chaîne de caractères un remplace les occurrences de variables.
Pour cela j'ai utilisé le Rapprochement "appendReplacement" méthode qui effectue la substitution et les boucles que sur les parties affectées d'une chaîne de format.
La classe helper n'est pas actuellement bien javadoc documenté. Je vais changements à l'avenir 😉
De toute façon j'ai commenté les lignes principales (je l'espère).
Vous pouvez créer une instance de la classe pour une Carte spécifique avec des valeurs (ou un suffixe, préfixe ou noKeyFunction)
comme:
En plus, vous pouvez définir ce qui se passe si une clé dans les valeurs de la Carte est manquante (fonctionne dans les deux façons, par exemple, mauvais nom de variable dans la chaîne de format ou de la clé manquante dans la Carte).
Le comportement par défaut est d'une levée décoché exception (case non cochée parce que je utiliser la valeur par défaut jdk8 Fonction qui cant handle checked exceptions) comme:
Vous pouvez définir un comportement personnalisé dans l'appel du constructeur comme:
ou la déléguer à la valeur par défaut pas de comportement de la touche:
Pour une meilleure manipulation il y a aussi la méthode statique de représentations comme:
Essayer Freemarker, la création de modèles de la bibliothèque.