2017-08-04 2 views
2

En Java, vous pouvez utiliser la fonction String.Format pour créer des chaînes formatées. Vous avez également la possibilité de référencer les arguments de la fonction dans l'ordre que vous souhaitez, en utilisant le i$ dans la chaîne de format, où i est l'index du paramètre que vous référencez. Malheureusement, il ne semble pas tout à être cohérent, parce que les deux lignes de code donnent exactement le même résultat suivant:Java String.format args incohérence d'indexation

String.format("My name is %0$s and I am %2$d years old", "Joe", 20); 
String.format("My name is %1$s and I am %2$d years old", "Joe", 20); 

Pourquoi 0 et 1 se réfèrent tous deux au même élément? N'est-il pas censé être une indexation strictement basée sur 1 au lieu de zéro?

+0

machine virtuelle Java est peut-être plus intelligent que vous êtes. Il peut reconnaître qu'un seul argument correspond au format% d et correspond en conséquence. – duffymo

+0

@duffymo Pas exactement le cas. Ici c'est 'Joe' qui est associé à la fois à l'index' 0' et '1', pas à l'argument entier – BackSlash

+0

Oui seulement les 20 correspondances pour le formateur décimal –

Répondre

3

On dirait qu'il ne reconnaît pas 0$, parce que l'index commence à partir de 1. Par conséquent, il récupère l'argument basé sur la position de ce %s. Par ici votre %0$s est la première référence pour un argument et par conséquent il prend le premier argument Joe.

Vous pouvez exécuter et voir la différence entre:

String.format("%s %1$s %2$d", 1, 20, 13); 
Output: 1, 1, 20 
String.format("%s %0$s %2$d", 1, 20, 13); 
Output: 1, 20, 20 
+0

Je trouve encore très curieux pourquoi il est implémenté de cette façon, parce que des choses comme ceci peut avoir une sortie incohérente: 'String.format ("% s,% 0 $ s,% 1 $ s,% 2 $ s,% 3 $ s,% 4 $ s ", 1, 2, 3, 4, 5) Mais j'accepte votre réponse comme réponse. – MatX