296 votes

Sprintf équivalent en Java

Printf ont été ajoutés à la Java avec la version 1.5, mais je n'arrive pas à trouver comment faire pour envoyer la sortie d'une chaîne plutôt que d'un fichier (qui est ce que sprintf n'en C). Personne ne sait comment faire cela?

501voto

Eugene Yokota Points 43213
String.format("%4d", i * j);

Voir format et sa syntaxe

28voto

FlySwat Points 61945

@erickson.

Les chaînes sont immuables types. Vous ne pouvez pas les modifier, seulement le retour de nouvelles instances de chaîne.

À cause de cela, "foo".format() n'a guère de sens, car il aurait pu être appelé comme

string newString = "foo".format();

L'original de java auteurs (et .NET auteurs), a décidé qu'une méthode statique ne fait plus de sens dans cette situation, comme vous n'êtes pas modifier "foo", mais au lieu d'appeler une méthode de mise en forme et en le passant dans une chaîne d'entrée.

EDIT: Eh, ce site peut être tellement amusant parfois. J'ai eu downvoted pour mentionner le fait que les chaînes de caractères sont immuables types.

Voici un exemple de pourquoi Format() serait muet comme une méthode d'instance. Dans .NET (et probablement en Java), Replace() est une méthode d'instance.

Vous pouvez faire ceci:

 "I Like Wine".Replace("Wine","Beer");

Cependant, il ne se passe rien, parce que les Chaînes sont immuables. Remplacer tente de retourner une nouvelle chaîne, mais il est affecté à rien.

Cela provoque beaucoup de communes erreurs de débutant comme:

// Contrived Example
inputText.Replace(" ","%20");

Encore une fois, rien ne se passe, au lieu que vous avez à faire :

inputText = inputText.Replace(" ","%20");

Maintenant, si vous comprenez que les chaînes sont immuables, qui a le sens parfait. Si vous ne le faites pas, alors vous êtes dans la confusion. Le bon endroit pour la Remplacer, serait où le Format est, comme une méthode statique de la Chaîne:

 inputText = String.Replace(inputText," ", "%20");

Maintenant, il n'est pas question de savoir ce qui se passe.

La vraie question est, pourquoi les auteurs de ces cadres de décider que l'on doit être une méthode d'instance, et l'autre statique? À mon avis, les deux sont plus élégamment exprimé en tant que méthodes statiques, mais erickson semble penser que les deux sont des méthodes d'instance.

Quel que soit votre avis, la vérité est que vous êtes moins enclin à faire une erreur en utilisant la version statique, et le code est plus facile à comprendre (Pas de Pièges Cachés).

Bien sûr, il ya quelques méthodes qui sont parfaits comme les méthodes d'instance, de prendre de la Chaîne.Longueur()

int length = "123".Length();

Dans cette situation, il est évident que nous ne sommes pas en train de la modifier "123", nous venons de l'examiner, et le retour de sa longueur...C'est un candidat parfait pour une méthode d'instance.

Mes règles simples, par Exemple des Méthodes sur des Objets Immuables:

  • Si vous avez besoin de renvoyer une nouvelle instance du même type, l'utilisation d'une méthode statique.
  • Sinon, utilisez une méthode d'instance.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X