Salvando zeros à frente do valor monetário

Bom Dia!!

Estou usando o código abaixo que encontrei na net para formatar o valor monetário na minha aplicação.
O problema está quando salva:
Digito: 1.000,00
Salva no banco: 0.010.000,00

[code]
package br.com.util;

import javax.swing.text.*;

public class Moeda extends PlainDocument {

private static final long serialVersionUID = 1L;  
public static final int NUMERO_DIGITOS_MAXIMO = 12;    

@SuppressWarnings(“static-access”)
public void insertString(int offs, String str, AttributeSet a) throws BadLocationException {

String texto = getText(0, getLength());
for (int i = 0; i < str.length(); i++) {
char c = str.charAt(i);
if (!Character.isDigit©) {
return;
}
}

if(texto.length() < this.NUMERO_DIGITOS_MAXIMO){
super.remove(0, getLength());
texto = texto.replace(".", “”).replace(",", “”);
StringBuffer s = new StringBuffer(texto + str);

if (s.length() > 0 && s.charAt(0) == ‘0’) {
s.deleteCharAt(0);
}

//Acho que o problema está aqui porque coloca os zeros à esquerda
if(s.length() < 3) {
if (s.length() < 1) {
s.insert(0,“000”);
}else if (s.length() < 2) {
s.insert(0,“00”);
}else{
s.insert(0,“0”);
}
}

s.insert(s.length()-2, “.”);

if(s.length() > 6) {
s.insert(s.length()-6, “.”);
}

if(s.length() > 10) {
s.insert(s.length()-10, “.”);
}

super.insertString(0, s.toString(), a);
}
}

public void remove(int offset, int length) throws BadLocationException {
super.remove(offset, length);
String texto = getText(0, getLength());
texto = texto.replace(",", “.”);
texto = texto.replace(".", “”);
super.remove(0, getLength());
insertString(0, texto, null);
} [/code]

}

KPaes o problema pode estar na forma como você está salvando no banco, pois como pode-se perceber se vc dar um get no texto ele irá aparecer exatamente como está sendo exibido.

Se possível coloca o código do banco e informa o tipo da variável a ser utilizada no banco.

[quote=urbgames]KPaes o problema pode estar na forma como você está salvando no banco, pois como pode-se perceber se vc dar um get no texto ele irá aparecer exatamente como está sendo exibido.

Se possível coloca o código do banco e informa o tipo da variável a ser utilizada no banco.[/quote]

No banco coloquei: salarioFunc numeric(12,2) not null

Parte do insert na dao

[code]public int inserirFuncionarios(Funcionario obj, int matri) throws DaoException{
Connection conn = DbUtil.getConnection();
PreparedStatement statement = null;
ResultSet result = null;

	try {
		statement = conn.prepareStatement(INSERIR_FUNCIONARIO);
		statement.setString(1, obj.getNomeFunc());
		statement.setString(2, obj.getTelFunc());
		statement.setString(3, obj.getProfissaoFunc());
		statement.setString(4, obj.getLogin());
		try {
			statement.setString(5, CriptografiaUtil.encripta(obj.getSenha())); //criptografando a senha
		} catch (NoSuchAlgorithmException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		statement.setDouble(6, obj.getSalarioFunc());			

		statement.setDouble(7, obj.getComissaoFunc());
		
		statement.executeUpdate();
		
		
		statement = conn.prepareStatement("select max(numFunc) from tbfuncionario");
		result = statement.executeQuery();
		
		result.next();
		matri = result.getInt(1);
		
		JOptionPane.showMessageDialog(null, "Cadastrado com Sucesso!\n Número do Funcionário: " + matri);
		

	} catch (SQLException e) {
		throw new DaoException(e);
	} finally {
		DbUtil.close(conn, statement, result);
	}
	return matri;		
}[/code]

Uma mascara (####,##) que eu usava antes salvava certinho no banco, mas causava o seguinte problema: tinha que colocar 0300,00 para salvar 300,00 que senão iria salvar como 3000,00

Olá amigo

qual o banco de dados que você está usando?

no banco de dados ele deve salvar assim:

1000.00 e não com , (vírgula)

exemplo com dados reais usando postgresql:

“3”;FALSE;“2011-07-23 00:00:00”;15;1;0.00;150.00;200.00;“1”

você pode usar a biblioteca open swing:

  CurrencyControl controldescontoOrcamento    = new CurrencyControl();
  CurrencyControl controlvalorOrcamento       = new CurrencyControl();
  CurrencyControl controlvalortotalOrcamento  = new CurrencyControl();
      controldescontoOrcamento.setAttributeName("orcamento_Desconto");
      controldescontoOrcamento.setDecimals(2);

      controlvalorOrcamento.setAttributeName("orcamento_Valor");
      controlvalorOrcamento.setDecimals(2);

      controlvalortotalOrcamento.setAttributeName("orcamento_ValorTotal");
      controlvalortotalOrcamento.setDecimals(2);
public Response insertRecord(ValueObject newPersistentObject) throws Exception {
    
    PreparedStatement stmt = null;
    try {
      stmt = conn.prepareStatement("insert into ORCAMENTO("
              + "DATAORCAMENTO,FK_ORDEMSERVICO,FK_TECNICO,DESCONTO,VALOR,VALORTOTAL,SITUACAO)"
              + " values(?,cast(? as bigint),cast(? as bigint),?,?,?,?)");
      OrcamentoVO vo = (OrcamentoVO)newPersistentObject;
      
      stmt.setTimestamp(1,data.getDateTimePostgres(conn));
      vo.setOrcamento_Fk_OrdemServico(OrcamentoGridController.pk);
      stmt.setString(2,vo.getOrcamento_Fk_OrdemServico());
      stmt.setString(3,vo.getOrcamento_Fk_Tecnico());
      stmt.setBigDecimal(4,vo.getOrcamento_Desconto());
      stmt.setBigDecimal(5,vo.getOrcamento_Valor());
      stmt.setBigDecimal(6,vo.getOrcamento_ValorTotal());
      stmt.setString(7,vo.getOrcamento_Situacao());

      stmt.execute();
      pk = vo.getOrcamento_Id();
      frame.getGrid().reloadData();
      return new VOResponse(vo);
    }
    catch (SQLException ex) {
      ex.printStackTrace();
      return new ErrorResponse(ex.getMessage());
    }
    finally {
      try {
        stmt.close();
        conn.commit();
      }
      catch (SQLException ex1) {
      }
    }

  }

Boa sorte

Silvio Guedes

[quote=silviogs]Olá amigo

qual o banco de dados que você está usando?

no banco de dados ele deve salvar assim:

1000.00 e não com , (vírgula)

exemplo com dados reais usando postgresql:

“3”;FALSE;“2011-07-23 00:00:00”;15;1;0.00;150.00;200.00;“1”

você pode usar a biblioteca open swing:

  CurrencyControl controldescontoOrcamento    = new CurrencyControl();
  CurrencyControl controlvalorOrcamento       = new CurrencyControl();
  CurrencyControl controlvalortotalOrcamento  = new CurrencyControl();
      controldescontoOrcamento.setAttributeName("orcamento_Desconto");
      controldescontoOrcamento.setDecimals(2);

      controlvalorOrcamento.setAttributeName("orcamento_Valor");
      controlvalorOrcamento.setDecimals(2);

      controlvalortotalOrcamento.setAttributeName("orcamento_ValorTotal");
      controlvalortotalOrcamento.setDecimals(2);
public Response insertRecord(ValueObject newPersistentObject) throws Exception {
    
    PreparedStatement stmt = null;
    try {
      stmt = conn.prepareStatement("insert into ORCAMENTO("
              + "DATAORCAMENTO,FK_ORDEMSERVICO,FK_TECNICO,DESCONTO,VALOR,VALORTOTAL,SITUACAO)"
              + " values(?,cast(? as bigint),cast(? as bigint),?,?,?,?)");
      OrcamentoVO vo = (OrcamentoVO)newPersistentObject;
      
      stmt.setTimestamp(1,data.getDateTimePostgres(conn));
      vo.setOrcamento_Fk_OrdemServico(OrcamentoGridController.pk);
      stmt.setString(2,vo.getOrcamento_Fk_OrdemServico());
      stmt.setString(3,vo.getOrcamento_Fk_Tecnico());
      stmt.setBigDecimal(4,vo.getOrcamento_Desconto());
      stmt.setBigDecimal(5,vo.getOrcamento_Valor());
      stmt.setBigDecimal(6,vo.getOrcamento_ValorTotal());
      stmt.setString(7,vo.getOrcamento_Situacao());

      stmt.execute();
      pk = vo.getOrcamento_Id();
      frame.getGrid().reloadData();
      return new VOResponse(vo);
    }
    catch (SQLException ex) {
      ex.printStackTrace();
      return new ErrorResponse(ex.getMessage());
    }
    finally {
      try {
        stmt.close();
        conn.commit();
      }
      catch (SQLException ex1) {
      }
    }

  }

Boa sorte

Silvio Guedes[/quote]

Estou utilizando sql server.

Vou testar o que você passou.

Obrigada!

Olá KPaes

perdoe-me por ter colocado “Amigo”. rsrsrsrsrs.

Open Swing:

https://sourceforge.net/projects/oswing/files/

existe uma pasta com os projetos Demos que você pode estudar. Demo10 foi por onde comecei.

Silvio Guedes

kkkkkkk

Relaxa, sem problemas (;