¿Cómo centrar una cadena usando String.format?

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)); } } 

salida:

 |FirstName |Init. |LastName | |Real | |Gagnon | |John |D |Doe | |John |F. |Kennedy | 

Quiero que la salida esté centrada. Si no utilizo ‘-‘ marcar, la salida se alineará a la derecha.

No encontré una bandera para centrar el texto en la API.

Este artículo contiene información sobre el formato, pero no justifica nada en el centro.

Rápidamente lo pirateé. Ahora puede usar StringUtils.center(String s, int size) en 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); } } } 

Aquí está la respuesta usando apache commons lang StringUtils.

Tenga en cuenta que debe agregar el archivo jar a la ruta de comstackción. Si está utilizando maven, asegúrese de agregar el lenguaje común en las dependencias.

 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)); } } 

Este es un ejemplo de cómo he manejado el centrado de encabezados de columna 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(); } } } 

Estaba jugando con la elegante respuesta de Mertuarez y decidí publicar mi versión.

 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) + "|"); } } } } 

Salida:

 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 | 

Diferencias prácticas del código de Mertuarez:

  1. El mío hace los cálculos al principio y hace la cadena centrada final de una sola vez en lugar de hacer una secuencia demasiado larga y luego tomar una subcadena de ella. Supongo que esto es un poco más eficiente, pero no lo probé.
  2. En el caso de texto que no se puede centrar perfectamente, el mío consistentemente lo sitúa medio personaje a la izquierda en lugar de ponerlo medio carácter en la mitad derecha del tiempo.
  3. En el caso de texto que es más largo que la longitud especificada, el mío devuelve consistentemente una subcadena de la longitud especificada que está enraizada al comienzo del texto original.

Convirtió el código que se encuentra en https://www.leveluplunch.com/java/examples/center-justify-string/ en una función pequeña y práctica de una línea:

 public static String centerString (int width, String s) { return String.format("%-" + width + "s", String.format("%" + (s.length() + (width - s.length()) / 2) + "s", s)); } 

Uso:

 public static void main(String[] args){ String out = centerString(10, "afgb"); System.out.println(out); //Prints " afgb " } 

Creo que es una solución muy clara que vale la pena mencionar.