public class Divers {
public static void main(String args[]){
String format = "|%1$-10s|%2$-10s|%3$-20s|\n";
System.out.format(format, "FirstName", "Init.", "LastName");
System.out.format(format, "Real", "", "Gagnon");
System.out.format(format, "John", "D", "Doe");
String ex[] = { "John", "F.", "Kennedy" };
System.out.format(String.format(format, (Object[])ex));
}
}
sortie:
|FirstName |Init. |LastName |
|Real | |Gagnon |
|John |D |Doe |
|John |F. |Kennedy |
Je veux que la sortie soit centrée. Si je n'utilise pas l'indicateur '-', la sortie sera alignée à droite.
Je n'ai pas trouvé d'indicateur pour centrer le texte dans l'API.
Cet article contient des informations sur le format, mais rien ne le justifie au centre.
J'ai rapidement piraté ça. Vous pouvez maintenant utiliser StringUtils.center(String s, int size)
dans String.format
.
import static org.hamcrest.CoreMatchers.*;
import static org.junit.Assert.assertThat;
import org.junit.Test;
public class TestCenter {
@Test
public void centersString() {
assertThat(StringUtils.center(null, 0), equalTo(null));
assertThat(StringUtils.center("foo", 3), is("foo"));
assertThat(StringUtils.center("foo", -1), is("foo"));
assertThat(StringUtils.center("moon", 10), is(" moon "));
assertThat(StringUtils.center("phone", 14, '*'), is("****phone*****"));
assertThat(StringUtils.center("India", 6, '-'), is("India-"));
assertThat(StringUtils.center("Eclipse IDE", 21, '*'), is("*****Eclipse IDE*****"));
}
@Test
public void worksWithFormat() {
String format = "|%1$-10s|%2$-10s|%3$-20s|\n";
assertThat(String.format(format, StringUtils.center("FirstName", 10), StringUtils.center("Init.", 10), StringUtils.center("LastName", 20)),
is("|FirstName | Init. | LastName |\n"));
}
}
class StringUtils {
public static String center(String s, int size) {
return center(s, size, ' ');
}
public static String center(String s, int size, char pad) {
if (s == null || size <= s.length())
return s;
StringBuilder sb = new StringBuilder(size);
for (int i = 0; i < (size - s.length()) / 2; i++) {
sb.append(pad);
}
sb.append(s);
while (sb.length() < size) {
sb.append(pad);
}
return sb.toString();
}
}
public static String center(String text, int len){
String out = String.format("%"+len+"s%s%"+len+"s", "",text,"");
float mid = (out.length()/2);
float start = mid - (len/2);
float end = start + len;
return out.substring((int)start, (int)end);
}
public static void main(String[] args) throws Exception{
// Test
String s = "abcdefghijklmnopqrstuvwxyz";
for (int i = 1; i < 200;i++){
for (int j = 1; j < s.length();j++){
center(s.substring(0, j),i);
}
}
}
Voici la réponse en utilisant Apache commons lang StringUtils.
Veuillez noter que vous devez ajouter le fichier jar au chemin de génération. Si vous utilisez maven, assurez-vous d’ajouter commons lang dans les dépendances.
import org.Apache.commons.lang.StringUtils;
public class Divers {
public static void main(String args[]){
String format = "|%1$-10s|%2$-10s|%3$-20s|\n";
System.out.format(format, "FirstName", "Init.", "LastName");
System.out.format(format,StringUtils.center("Real",10),StringUtils.center("",10),StringUtils.center("Gagnon",20);
System.out.format(String.format(format, (Object[])ex));
}
}
Converti le code présent sur https://www.leveluplunch.com/Java/examples/center-justify-string/ en une petite fonction pratique à une ligne:
public static String centerString (int width, String s) {
return String.format("%-" + width + "s", String.format("%" + (s.length() + (width - s.length()) / 2) + "s", s));
}
Usage:
public static void main(String[] args){
String out = centerString(10, "afgb");
System.out.println(out); //Prints " afgb "
}
Je pense que c'est une solution très soignée qui mérite d'être mentionnée.
Je jouais avec la réponse élégante de Mertuarez ci-dessus et j'ai décidé de poster ma version.
public class CenterString {
public static String center(String text, int len){
if (len <= text.length())
return text.substring(0, len);
int before = (len - text.length())/2;
if (before == 0)
return String.format("%-" + len + "s", text);
int rest = len - before;
return String.format("%" + before + "s%-" + rest + "s", "", text);
}
// Test
public static void main(String[] args) {
String s = "abcde";
for (int i = 1; i < 10; i++){
int max = Math.min(i, s.length());
for (int j = 1; j <= max; j++){
System.out.println(center(s.substring(0, j), i) + "|");
}
}
}
}
Sortie:
a|
a |
ab|
a |
ab |
abc|
a |
ab |
abc |
abcd|
a |
ab |
abc |
abcd |
abcde|
a |
ab |
abc |
abcd |
abcde |
a |
ab |
abc |
abcd |
abcde |
a |
ab |
abc |
abcd |
abcde |
a |
ab |
abc |
abcd |
abcde |
Différences pratiques du code de Mertuarez:
Voici un exemple de la façon dont j'ai géré le centrage des en-têtes de colonnes en Java:
public class Test {
public static void main(String[] args) {
String[] months = { "January", "February", "March", "April", "May", "June", "July", "August", "September",
"October", "November", "December" };
// Find length of longest months value.
int maxLengthMonth = 0;
boolean firstValue = true;
for (String month : months) {
maxLengthMonth = (firstValue) ? month.length() : Math.max(maxLengthMonth, month.length());
firstValue = false;
}
// Display months in column header row
for (String month : months) {
StringBuilder columnHeader = new StringBuilder(month);
// Add space to front or back of columnHeader
boolean addAtEnd = true;
while (columnHeader.length() < maxLengthMonth) {
if (addAtEnd) {
columnHeader.append(" ");
addAtEnd = false;
} else {
columnHeader.insert(0, " ");
addAtEnd = true;
}
}
// Display column header with two extra leading spaces for each
// column
String format = " %" + Integer.toString(maxLengthMonth) + "s";
System.out.printf(format, columnHeader);
}
System.out.println();
// Display 10 rows of random numbers
for (int i = 0; i < 10; i++) {
for (String month : months) {
double randomValue = Math.random() * 999999;
String format = " %" + Integer.toString(maxLengthMonth) + ".2f";
System.out.printf(format, randomValue);
}
System.out.println();
}
}
}