Completar zeros de uma String

Boa tarde galera, blz?

Passando aqui novamente para pedir auxílio aos nobres colegas novamente… :lol:

Seguinte, estou trabalhando no projeto de um middleware, onde o “Pedreiro de software” do sistema legado, resolveu colocar no banco de dados uma coluna do tipo float para armazenar o CNPJ dos clientes (não me pergunte porque :lol: )

O problema é que este tipo está truncando os zeros iniciais dos CNPJs que possuem zero no começo, tendo que ser consertado via programação…

Existe alguma classe que me ajudaria a fazer esta padronização, tipo o DecimalFormat, criar uma mascara de 14 digitos e jogar o número para ser formatado?

vlw
:stuck_out_tongue:

Tem uma forma bem estúpida que é a de pegar o tal número e imprimi-lo com zeros à esquerda, usando %011d ou %014d.
Vamos dar um exemplo besta.

long x = 12345678901L;
String cpf = String.format ("%011d", x); // 12345678901
String cnpj = String.format ("%014d", x); // 00012345678901

Note que %d aceita apenas números int ou long. Se seu número é um Double você pode ter problemas porque um double tem no máximo 15 casas de precisão, e ele requer o formato %f (e se não me engano, %f não aceita o indicador %0 para indicar que você tem de completar com zeros à esquerda.)

Como é o padrão atual, ou seja, como os CNPJs já inseridos no banco que possuem zeros à esquerda estão armazenados? Isso ajudará a tomar uma decisão.

Não há possibilidade de mudar o tipo dessa coluna e fazer os ajustes necessários? Acho que seria o mais sensato.

Se não há essa possibilidade, uma gambi possível, é convencionar que só são válidos os x primeiros números depois do vírgula (ou ponto).

regis,

No banco, continuam e irão continuar como float, pois trata-se de um sistema de 1900 e bolinha… :lol:

Infelizmente a maioria que possui zero está truncado no banco.

Estou tentando uma gambiarra utilizando o String format que o entanglement me sugeriu :stuck_out_tongue:

O que você chama de “float” é o FLOAT do banco, não o float do Java, certo?

É porque o float do Java tem apenas 6 algarismos significativos de precisão, ou seja, não consegue guardar CPFs (que exigem 11 dígitos) ou CNPJs (que exigem 14 dígitos) de precisão.

Bom dia, zerone !

Recupera a variavel float do banco de dados utilizando o BigDecimal. Isso deve resolver.

//Recupera do Banco de dados como BigDecimal
BigDecimal cnpj = new BigDecimal(00932978803.00);

//Utiliza o int normal
System.out.println( String.format ("%014d", cnpj.intValue() ) );

Abraços.

Cuidado que um CPF (e com mais razão um CNPJ) não cabe em um int (9 dígitos significativos) - você tem de usar long.

Muito boa observação Entanglement.

Obrigado.

bom dia rapaziada…

entanglement,

No banco realmente a coluna está como float e trago os dados para uma string utilizando o getLong() do ResultSet.

Estou conseguindo “consertar” com o String format, mas fiz uma nova classe para cuidar da formatação, pois resolveram inventar de guardar CPF/CNPJ no mesmo campo :cry: :lol:

Obrigado pela ajuda de todos :wink:

Guardar CPF e CNPJ no mesmo campo, e como um valor numérico, é uma idéia que normalmente se encontra em pessoas que alguma vez na sua vida trabalharam com mainframes (principalmente no setor bancário) onde você tem milhões de clientes e cada byte fazia diferença na hora de definir a estrutura de uma tabela.
O problema é quando você não tem um campo adicional para dizer se o número é um CPF ou CNPJ :frowning:

Aqui onde trabalho também existe uma tabela com uma mesma coluna para cpf e cnpj.

Pra resolver o problema eu tenho um método que recebe o número e retorna se é cpf ou cnpj e então eu tenho outro método que preenche os zeros à esquerda de acordo com o tipo de identificação, usando simplesmente o método “.insert(0,“0”)” do StringBuilder.

[quote=entanglement]Guardar CPF e CNPJ no mesmo campo, e como um valor numérico, é uma idéia que normalmente se encontra em pessoas que alguma vez na sua vida trabalharam com mainframes (principalmente no setor bancário) onde você tem milhões de clientes e cada byte fazia diferença na hora de definir a estrutura de uma tabela.
O problema é quando você não tem um campo adicional para dizer se o número é um CPF ou CNPJ :frowning:
[/quote]

Eu estou passando por esse problema. Eu recebo um campo documento através do XML, mas não tem diferenciação se é CPF ou CNPJ. Como corta os zeros a esquerda, acabo que não tenho como saber qual tipo de documento é.

Tenho procurado, mas não vi nenhuma solução parecida.