Caros amigos, é a primeira vez que eu faço uma pergunta e espero estar no lugar certo.
Primeiro quero parabenizar a todos do forum. Para mim este é o melhor do mundo.
Sempre que preciso venho buscar soluções aqui.
Minha dúvida é a seguinte: Consegui formatar um JFormattedTextfield para ficar tipo moeda e ir acrescentado os pontos automaticamente ao digitar. Ele funciona bem, mas da forma como coloquei o DecimalFormat ele não permite inserir os centavos. Não consegui resolver por nada. Por favor me ajudem. Segue o código abaixo…
DecimalFormat decimal = new DecimalFormat ("#,###,###.00");
NumberFormatter numFormatter = new NumberFormatter(decimal);
numFormatter.setFormat(decimal);
numFormatter.setAllowsInvalid(false); //impossibilita digitação diferente de números
final JFormattedTextField txtValorMerc = new JFormattedTextField();
txtValorMerc.setFormatterFactory(new DefaultFormatterFactory(numFormatter));
txtValorMerc.setBounds(125,140,110,20);
txtValorMerc.setFont(new Font("Times New Roman",Font.BOLD,14));
this.add(txtValorMerc); // adicionando no JInternalframe...
Do jeito que está o código funciona perfeitamente, porém não consigo adicionar os centavos, pois o “00” é fixo.
E também não funciona se colocar tudo com “#”, já tentei também…
Então quando eu quero por exemplo colocar o valor 15.250,59, eu digito no campo ‘15250,29’ e quando perde o focus, o valor é transformado.
Abraços!
S
sidneycpereira
Valeu ajFilho, já tinha feito isto e realmente funciona, mas eu queria mesmo era já poder digitar o valor na mesma formatação do restante do JTEXTFIELD. Mas mesmo assim valeu por tentar ajudar. Por acaso alguém sabe por que é que quando se muda o “,00” para ## não funciona mais???
L
Leandro_Vecchi
Oi Sidney, tenta esse código abaixo e vê se resolve seu problema:
Obrigado pela atenção Leandro. É por isso que eu sempre digo que esse é o melhor forum do mundo. A galera sempre tenta ajudar… Vou tentar implementar e depois eu digo o que e consegui… valeu…
W
wellington7
tente tb com
DecimalFormat decimalFormat = new DecimalFormat("###,###,###\.##");
R
renzonuccitelli
Já vi vários outros posts como esse aqui pelo Guj, mas nunca encontrei um interface que se comportasse como eu queria para valores de moeda. Então decidi fazer um TextField que se comportasse de forma parecida ao funcionamento de caixas eletrônicos. Segue o código:
/*Classe desenvolvida por Renzo Nuccitelli * para fazer validação de valores monetários * em Real */publicclassTextFieldMoedaRealextendsJTextFieldimplementsKeyListener{privateStringBuilderlastValidNumber;/** * Aceita um BigDecimal com escala 2. * Outras escalas não são serão aceitas * * @param BigDecimal */publicvoidsetNumber(BigDecimaldecimal){System.out.println("escala: "+decimal.scale());if(decimal.scale()==2){lastValidNumber=newStringBuilder(decimal.unscaledValue().toString());super.setText(getRealFormat());}}/**Retorna um BigDecimal com o valor encontrando no campo * e com escala igual a 2 * * @return BigDecimal */publicBigDecimalgetNumber(){BigDecimalnumber;if(lastValidNumber.length()==0)number=newBigDecimal("0");elsenumber=newBigDecimal(lastValidNumber.toString());number.setScale(2);returnnumber.divide(newBigDecimal(100));}/**Aceita valor em centavos. * O valor não deve possuir ponto ou vírgula * * @param String */publicvoidsetText(Stringnumber){if(isNumber(number))lastValidNumber=newStringBuilder(number);super.setText(getRealFormat());}privatebooleanisNumber(Stringnumber){for(charc:number.toCharArray()){if(!Character.isDigit(c))returnfalse;}returntrue;}publicTextFieldMoedaReal(){super();this.setCaretPosition(this.getText().length());this.addKeyListener(this);lastValidNumber=newStringBuilder();super.setText(getRealFormat());}@OverridepublicvoidkeyPressed(KeyEvente){}@OverridepublicvoidkeyReleased(KeyEvente){if(Character.isDigit(e.getKeyChar())){lastValidNumber.append(e.getKeyChar());}elseif(e.getKeyCode()==KeyEvent.VK_BACK_SPACE){if(lastValidNumber.length()>0){lastValidNumber.deleteCharAt(lastValidNumber.length()-1);}}this.setText(getRealFormat());}@OverridepublicvoidkeyTyped(KeyEvente){}privateStringgetRealFormat(){if(lastValidNumber.length()==0)return"0,00";elseif(lastValidNumber.length()==1)return"0,0"+lastValidNumber;elseif(lastValidNumber.length()==2)return"0,"+lastValidNumber;elsereturnbuildPrefixSeparateWithDots()+lastValidNumber.substring(lastValidNumber.length()-2);}privateStringbuildPrefixSeparateWithDots(){StringBuilderbuilder=newStringBuilder();for(intindex=0;index<lastValidNumber.length()-2;++index){builder.append(lastValidNumber.charAt(index));if((lastValidNumber.length()-index)%3==0&&lastValidNumber.length()-index>5)builder.append(".");}builder.append(',');returnbuilder.toString();}}
S
sidneycpereira
Obrigado Renzo, pra falar a verdade eu pensei que seria mais simples… mas vou tentar assim mesmo… valeu… até mais…
G
gbvbahia01
renzonuccitelli:
Já vi vários outros posts como esse aqui pelo Guj, mas nunca encontrei um interface que se comportasse como eu queria para valores de moeda. Então decidi fazer um TextField que se comportasse de forma parecida ao funcionamento de caixas eletrônicos. Segue o código:
/*Classe desenvolvida por Renzo Nuccitelli * para fazer validação de valores monetários * em Real */publicclassTextFieldMoedaRealextendsJTextFieldimplementsKeyListener{privateStringBuilderlastValidNumber;/** * Aceita um BigDecimal com escala 2. * Outras escalas não são serão aceitas * * @param BigDecimal */publicvoidsetNumber(BigDecimaldecimal){System.out.println("escala: "+decimal.scale());if(decimal.scale()==2){lastValidNumber=newStringBuilder(decimal.unscaledValue().toString());super.setText(getRealFormat());}}/**Retorna um BigDecimal com o valor encontrando no campo * e com escala igual a 2 * * @return BigDecimal */publicBigDecimalgetNumber(){BigDecimalnumber;if(lastValidNumber.length()==0)number=newBigDecimal("0");elsenumber=newBigDecimal(lastValidNumber.toString());number.setScale(2);returnnumber.divide(newBigDecimal(100));}/**Aceita valor em centavos. * O valor não deve possuir ponto ou vírgula * * @param String */publicvoidsetText(Stringnumber){if(isNumber(number))lastValidNumber=newStringBuilder(number);super.setText(getRealFormat());}privatebooleanisNumber(Stringnumber){for(charc:number.toCharArray()){if(!Character.isDigit(c))returnfalse;}returntrue;}publicTextFieldMoedaReal(){super();this.setCaretPosition(this.getText().length());this.addKeyListener(this);lastValidNumber=newStringBuilder();super.setText(getRealFormat());}@OverridepublicvoidkeyPressed(KeyEvente){}@OverridepublicvoidkeyReleased(KeyEvente){if(Character.isDigit(e.getKeyChar())){lastValidNumber.append(e.getKeyChar());}elseif(e.getKeyCode()==KeyEvent.VK_BACK_SPACE){if(lastValidNumber.length()>0){lastValidNumber.deleteCharAt(lastValidNumber.length()-1);}}this.setText(getRealFormat());}@OverridepublicvoidkeyTyped(KeyEvente){}privateStringgetRealFormat(){if(lastValidNumber.length()==0)return"0,00";elseif(lastValidNumber.length()==1)return"0,0"+lastValidNumber;elseif(lastValidNumber.length()==2)return"0,"+lastValidNumber;elsereturnbuildPrefixSeparateWithDots()+lastValidNumber.substring(lastValidNumber.length()-2);}privateStringbuildPrefixSeparateWithDots(){StringBuilderbuilder=newStringBuilder();for(intindex=0;index<lastValidNumber.length()-2;++index){builder.append(lastValidNumber.charAt(index));if((lastValidNumber.length()-index)%3==0&&lastValidNumber.length()-index>5)builder.append(".");}builder.append(',');returnbuilder.toString();}}
Valeu! :D
Aprovado, funciona perfeitamente!
C
casardo
Olá pessoal, desculpa a ignorância , mas como eu adiciono esse código ( classe ) no meu código, pois, já tenho o formulário pronto mas não sei como usar esse exemplo passado aqui no meu código, agradeço desde já. :lol:
E
enantiomero
troque as declarações dos jtextfields que você precisa que sejam do tipo “moeda”, já que:
publicclassTextFieldMoedaRealextendsJTextField
Por exemplo, se no seu código você tem um JTextField declarado assim:
Você não sabe o quanto me ajudou! O que eu estava procurando era exatamente uma máscara igual ao dos caixas eletrônicos e como ainda não tenho “cacife” para isso…
C
casardo
enantiomero, naquela ocasião não consegui usar essa classe no meu código, não consegui mudar o que você mandou, pois, aqui no netbeans não consegui achar esse código que você postou aqui:
Por exemplo, se no seu código você tem um JTextField declarado assim:
Esse método eu o substitui por este e funcionou beleza.
@OverridepublicvoidsetText(Stringnumber){if(number==null){// Aqui que estava dando null pointerlastValidNumber=newStringBuilder("");}elseif(isNumber(number)){lastValidNumber=newStringBuilder(number);}super.setText(getRealFormat());}