Comment utiliser java.Ssortingng.format dans Scala?

J’essaie d’utiliser une méthode .format d’une chaîne. Mais si je place% 1,% 2, etc. dans la chaîne, java.util.UnknownFormatConversionException est renvoyé en pointant sur un morceau de code source Java déroutant:

 private void checkText(Ssortingng s) { int idx; // If there are any '%' in the given ssortingng, we got a bad format // specifier. if ((idx = s.indexOf('%')) != -1) { char c = (idx > s.length() - 2 ? '%' : s.charAt(idx + 1)); throw new UnknownFormatConversionException(Ssortingng.valueOf(c)); } } 

De ceci je comprends que % char est interdit. Si oui, alors que dois-je utiliser pour les espaces réservés d’argument?

J’utilise Scala 2.8.

Bien que toutes les réponses précédentes soient correctes, elles sont toutes en Java. Voici un exemple Scala:

 val placeholder = "Hello %s, isn't %s cool?" val formatted = placeholder.format("Ivan", "Scala") 

J’ai également un article sur le blog qui pourrait être utile pour créer un format tel que l’opérateur % de Python .

Vous n’avez pas besoin d’utiliser des chiffres pour indiquer le positionnement. Par défaut, la position de l’argument est simplement l’ordre dans lequel il apparaît dans la chaîne.

Voici un exemple de la manière appropriée d’utiliser ceci:

 Ssortingng result = Ssortingng.format("The format method is %s!", "great"); // result now equals "The format method is great!". 

Vous utiliserez toujours un % suivi de quelques autres caractères pour que la méthode sache comment afficher la chaîne. %s est probablement le plus courant, et cela signifie simplement que l’argument doit être traité comme une chaîne.

Je ne vais pas énumérer toutes les options, mais je vais vous donner quelques exemples pour vous donner une idée:

 // we can specify the # of decimals we want to show for a floating point: Ssortingng result = Ssortingng.format("10 / 3 = %.2f", 10.0 / 3.0); // result now equals "10 / 3 = 3.33" // we can add commas to long numbers: result = Ssortingng.format("Today we processed %,d transactions.", 1000000); // result now equals "Today we processed 1,000,000 transactions." 

Ssortingng.format utilise juste un java.util.Formatter , donc pour une description complète des options, vous pouvez voir les javadocs de Formatter .

Et, comme le mentionne BalusC, vous verrez dans la documentation qu’il est possible de modifier l’ordre des arguments par défaut si nécessaire. Cependant, il est probable que la seule fois où vous en aurez besoin ou que vous souhaiterez le faire est d’utiliser le même argument plus d’une fois.

Au lieu de regarder le code source, vous devriez lire la syntaxe javadoc Ssortingng.format () et Formatter .

Vous spécifiez le format de la valeur après le%. Par exemple, pour un entier décimal, il s’agit de d , et pour Ssortingng, il s’agit de s :

 Ssortingng aSsortingng = "world"; int aInt = 20; Ssortingng.format("Hello, %s on line %d", aSsortingng, aInt ); 

Sortie:

 Hello, world on line 20 

Pour faire ce que vous avez essayé (utilisez un index d’argument), vous utilisez: *n*$ ,

 Ssortingng.format("Line:%2$d. Value:%1$s. Result: Hello %1$s at line %2$d", aSsortingng, aInt ); 

Sortie:

 Line:20. Value:world. Result: Hello world at line 20 

Vous pouvez utiliser ceci;

 Ssortingng.format("%1$s %2$s %2$s %3$s", "a", "b", "c"); 

Sortie:

abbc

Notez également que Scala étend Ssortingng avec un certain nombre de méthodes (via une conversion implicite en un WrappedSsortingng apporté par Predef), vous pouvez donc également effectuer les opérations suivantes:

 val formattedSsortingng = "Hello %s, isn't %s cool?".format("Ivan", "Scala") 

La référence officielle est la classe Formatter .

Dans Scala 2.10

 val name = "Ivan" val weather = "sunny" s"Hello $name, it's $weather today!" 

Ceci est une liste de ce que Ssortingng.format peut faire. La même chose vaut pour printf

 int i = 123; o.printf( "|%d|%d|%n" , i, -i ); // |123|-123| o.printf( "|%5d|%5d|%n" , i, -i ); // | 123| –123| o.printf( "|%-5d|%-5d|%n" , i, -i ); // |123 |-123 | o.printf( "|%+-5d|%+-5d|%n" , i, -i ); // |+123 |-123 | o.printf( "|%05d|%05d|%n%n", i, -i ); // |00123|-0123| o.printf( "|%X|%x|%n", 0xabc, 0xabc ); // |ABC|abc| o.printf( "|%04x|%#x|%n%n", 0xabc, 0xabc ); // |0abc|0xabc| double d = 12345.678; o.printf( "|%f|%f|%n" , d, -d ); // |12345,678000| |-12345,678000| o.printf( "|%+f|%+f|%n" , d, -d ); // |+12345,678000| |-12345,678000| o.printf( "|% f|% f|%n" , d, -d ); // | 12345,678000| |-12345,678000| o.printf( "|%.2f|%.2f|%n" , d, -d ); // |12345,68| |-12345,68| o.printf( "|%,.2f|%,.2f|%n" , d, -d ); // |12.345,68| |-12.345,68| o.printf( "|%.2f|%(.2f|%n", d, -d ); // |12345,68| |(12345,68)| o.printf( "|%10.2f|%10.2f|%n" , d, -d ); // | 12345,68| | –12345,68| o.printf( "|%010.2f|%010.2f|%n",d, -d ); // |0012345,68| |-012345,68| Ssortingng s = "Monsterbacke"; o.printf( "%n|%s|%n", s ); // |Monsterbacke| o.printf( "|%S|%n", s ); // |MONSTERBACKE| o.printf( "|%20s|%n", s ); // | Monsterbacke| o.printf( "|%-20s|%n", s ); // |Monsterbacke | o.printf( "|%7s|%n", s ); // |Monsterbacke| o.printf( "|%.7s|%n", s ); // |Monster| o.printf( "|%20.7s|%n", s ); // | Monster| Date t = new Date(); o.printf( "%tT%n", t ); // 11:01:39 o.printf( "%tD%n", t ); // 04/18/08 o.printf( "%1$te. %1$tb%n", t ); // 18. Apr 

Voici une liste des formateurs utilisés avec Ssortingng.format ()

http://docs.oracle.com/javase/1.5.0/docs/api/java/util/Formatter.html

Bien que @Londo ait mentionné l’interpolateur de chaîne “s” de Scala, je pense que l’ interpolateur de chaîne “f” de Scala est plus adapté à la question initiale. L’exemple utilisé quelques fois dans d’autres réponses pourrait également être écrit (depuis Scala 2.10) de cette façon:

 scala> val name = "Ivan" name: Ssortingng = Ivan scala> val thing = "Scala" thing: Ssortingng = Scala scala> val formatted = f"Hello $name%s, isn't $thing%s cool?" formatted: Ssortingng = Hello Ivan, isn't Scala cool? 

Le lien avec la question initiale est de savoir que:

  • formatted est défini avec une chaîne préfixée par la lettre “f”. C’est l’interpolateur de chaîne “f” (formatage).
  • L’interpolateur de chaîne “f” utilise java.util.Formatter
  • java.lang.Ssortingng.format utilise le même java.util.Formatter

La bonne chose à propos de l’interpolation de chaîne est qu’elle vous permet de voir quelle variable est substituée directement dans la chaîne au lieu de devoir la faire correspondre aux arguments de la méthode Ssortingng.format .

Dans Scala, pour Interpolation de chaîne, nous avons $ qui sauve la journée et rend notre vie beaucoup plus facile:

Par exemple: Vous voulez définir une fonction qui prend le nom et l’âge d’entrée et dit Bonjour avec le nom et dit son âge. Cela peut être écrit comme ceci:

 def funcSsortingngInterpolationDemo(name:Ssortingng,age:Int)=s"Hey ! my name is $name and my age is $age" 

Par conséquent, lorsque vous appelez cette fonction: comme ceci:

 funcSsortingngInterpolationDemo("Shivansh",22) 

Sa sortie serait:

 Hey ! my name is Shivansh and my age is 22 

Vous pouvez écrire le code pour le changer dans la même ligne, comme si vous voulez append 10 ans à l’âge!

alors la fonction pourrait être:

 def funcSsortingngInterpolationDemo(name:Ssortingng,age:Int)=s"Hey ! my name is $name and my age is ${age+10}" 

Et maintenant, le résultat serait:

 Hey ! my name is Shivansh and my age is 32