Você pode usar o método String.format
:
private static String formata(String s, char fillChar, int tamanho) {
return String.format("%" + tamanho + "s", s).replace(' ', fillChar);
}
public static void main(String[] args) throws Exception {
String teste = "0123456";
System.out.println(formata(teste, '0', 10)); // 0000123456
}
Infelizmente, o formato %[tamanho]s
sempre preenche com espaços, então você precisa fazer um replace
para trocar os espaços pelo caractere que deseja.
Só que isso não vai funcionar se a string original tiver espaços. Por exemplo, se for "01234 6"
, o resultado será 0000123406
(o espaço antes do 6
também é substituído).
Para resolver este problema, você pode usar um StringBuilder
, e ir adicionando o caractere no início, até que ele fique do tamanho desejado:
private static String formata(String s, char fillChar, int tamanho) {
StringBuilder sb = new StringBuilder(s);
while (sb.length() < tamanho) {
sb.insert(0, fillChar);
}
return sb.toString();
}
Isso resolve o problema do espaço mencionado acima.
Claro que também dá pra fazer o mesmo concatenando strings:
private static String formata(String s, char fillChar, int tamanho) {
String result = s;
while (result.length() < tamanho) {
result = fillChar + result;
}
return result;
}
Mas para concatenação em um loop, usar StringBuilder
costuma ser mais eficiente (claro que para poucas strings pequenas a diferença será imperceptível, mas de qualquer forma é bom saber a diferença).
Para Java >= 11
A partir do Java 11 você pode usar o método repeat
:
private static String formata(String s, char fillChar, int tamanho) {
// se a string já é maior que o tamanho, não tem o que fazer
if (s.length() >= tamanho) {
return s;
}
// subtrai "tamanho" do tamanho da string, para saber quantas vezes preciso repetir o fillChar
// e concatena com a própria string
return new String(new char[] {fillChar}).repeat(tamanho - s.length()) + s;
}
PS: se a ideia é formatar números (ou seja, um int
e não qualquer String
), aí muda um pouco:
public static String formata(int n, int tamanho) {
return String.format("%0" + tamanho + "d", n);
}
public static void main(String[] args) throws Exception {
int n = 123456;
System.out.println(formata(n, 10));
}
Só que aí já não é mais tão flexível, pois não pode ser qualquer caractere (o formato para números é mais restrito, permitindo apenas zero ou espaços).