Salvando zeros à frente do valor monetário

6 respostas
KPaes

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

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(c)) {    
          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);    
  }
}

6 Respostas

U

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.

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

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

Parte do insert na dao
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;		
	}

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

S

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

KPaes

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

Estou utilizando sql server.

Vou testar o que você passou.

Obrigada!

S

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

KPaes

kkkkkkk

Relaxa, sem problemas (;

Criado 20 de outubro de 2013
Ultima resposta 23 de out. de 2013
Respostas 6
Participantes 3