Lorsque le format String # était utilisé en Java avec un mélange de caractères demi-largeur et pleine largeur, les positions des caractères étaient mal alignées. Il n'y avait pas de moyen facile de le résoudre même si je cherchais trop, alors j'ai essayé de créer une fonction.
Immédiatement, mais la solution est la suivante.
(Pour le moment, copiez et collez simplement les suivants format ()
et getByteLength ()
pour résoudre le problème)
main
public static void main(String[] args){
//Instruction de format de décalage
System.out.println(String.format("%-20s", "Ahhhh")+" | ");
System.out.println(String.format("%-20s", "aaaaa")+" | ");
//Instruction de format qui ne change pas
System.out.println(format("Ahhhh", 20)+" | ");
System.out.println(format("aaaaa", 20)+" | ");
}
private static String format(String target, int length){
int byteDiff = (getByteLength(target, Charset.forName("UTF-8"))-target.length())/2;
return String.format("%-"+(length-byteDiff)+"s", target);
}
private static int getByteLength(String string, Charset charset) {
return string.getBytes(charset).length;
}
result
Ahhhh|
aaaaa |
Ahhhh|
aaaaa |
(C'est un secret que «|» était mal aligné lors du copier-coller sur Qiita ...) Ce qui suit est un aparté.
En premier lieu, la raison pour laquelle il y a une différence entre la demi-largeur et la pleine largeur est que le nombre d'octets diffère comme suit lors de l'expression de caractères avec ʻUTF-8`.
Donc, je suis en train de régler avec ʻint byte Diff dans
main`.
En outre, à partir de la fonction suivante, vous pouvez voir que le japonais est de 3 octets et l'anglais est de 1 octet.
analyze
public static void main(String[] args){
analyze("Ahhhh");
analyze("aaaaa");
}
private static void analyze(String target){
System.out.println("\n"+target);
int length=20;
System.out.println(format("length()", length)+":"+target.length());
System.out.println(format("UTF-8 length()", length)+":"+getByteLength(target, Charset.forName("UTF-8")));
System.out.println(format("diff", length)+":"+(getByteLength(target, Charset.forName("UTF-8"))-target.length())/2);
}
result
Ahhhh
length() :5
UTF-8 length() :15
diff :5
aaaaa
length() :5
UTF-8 length() :5
diff :0
Recommended Posts