Question

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?

Était-ce utile?

La solution

// Store the formatted string in 'result'
String result = String.format("%4d", i * j);

// Write the result to standard output
System.out.println( result );

Voir format et son la syntaxe

Autres conseils

@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() fait peu de sens, comme il l'aurait du s'appeler 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.

MODIFIER:Heh, 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.

Les deux solutions workto simuler printf, mais d'une manière différente.Par exemple, pour convertir une valeur à une chaîne hexadécimale, vous avez 2 solutions suivantes:

  • avec format(), proche de sprintf():

    final static String HexChars = "0123456789abcdef";
    
    public static String getHexQuad(long v) {
        String ret;
        if(v > 0xffff) ret = getHexQuad(v >> 16); else ret = "";
        ret += String.format("%c%c%c%c",
            HexChars.charAt((int) ((v >> 12) & 0x0f)),
            HexChars.charAt((int) ((v >>  8) & 0x0f)),
            HexChars.charAt((int) ((v >>  4) & 0x0f)),
            HexChars.charAt((int) ( v        & 0x0f)));
        return ret;
    }
    
  • avec replace(char oldchar , char newchar), un peu plus rapide, mais assez limité:

        ...
        ret += "ABCD".
            replace('A', HexChars.charAt((int) ((v >> 12) & 0x0f))).
            replace('B', HexChars.charAt((int) ((v >>  8) & 0x0f))).
            replace('C', HexChars.charAt((int) ((v >>  4) & 0x0f))).
            replace('D', HexChars.charAt((int) ( v        & 0x0f)));
        ...
    
  • Il existe une troisième solution composée de simplement ajouter le char à ret un par un (char sont des nombres qui ajouter les unes aux autres!) comme dans:

    ...
    ret += HexChars.charAt((int) ((v >> 12) & 0x0f)));
    ret += HexChars.charAt((int) ((v >>  8) & 0x0f)));
    ...
    

...mais ce serait vraiment laid.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top