String java

Fala pessoal, tudo certo? Eu estava fazendo uns testes aqui para apresentar de forma mais padronizada os dados na tela do meu programa, e me veio a seguinte ideia, eu tenho códigos de produtos em formato de string, só que eles tem tamanhos variáveis, porém eu queria que todos tivessem o mesmo tamanho na hora de apresentar, então a minha ideia foi o seguinte. Eu recebo o código e enquanto ele for diferente de um valor x ele concatena um 0 atrás do texto, alguém sabe se seria possível?

O código abaixo não teria como funcionar, mas é só pra demonstrar a lógica que eu estou tentando fazer →

private static String teste = "0123456";
	
	private static String teste(String teste) {
		String testess = "";
		
		do {
			testess =+ 0; 
			System.out.println(testess);
		} while (testess.length() != 10);
		
		return teste;
	}

resultado esperado = "0000123456";

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).

1 curtida

Muito obrigado! funcionou certinho aqui !!