Valores decimais, digita com virgula, grava com ponto, exibe com virgula

Eu já li vários tópicos e vários artigos sobre isso, mas ainda estou com um problema.

Os números são gravados no MySQL com PONTO decimal, quandou vou exibí-los na tela após uma consulta utilizo o DecimalFormat para fazê-los aparecer com VIRGULA decimal, até aí, tudo bem, fazendo assim:

    private DecimalFormat df = new DecimalFormat("0.00"); //mesmo estando com . na exibição aparece ,

   jT6101.setText(String.valueOf(df.format(rs.getFloat("6101GN")*1.055056)));

O meu problema é que o valor desse textfield pode ser editado pelo usuário e o usuário irá gravar o valor no BD.
Como o valor está sendo exibido com VIRGULA decimal, o usuário irá digitá-lo também com vírgula, mas para gravar no BD eu preciso mudar isso pra PONTO.

A dúvida é: Como eu mudo o número novamente para o formato de PONTO decimal para que eu consiga gravar no BD?

       resultado = access.transmite("update tabela set 6101GN = "+Float.parseFloat(jT6101.getText())+" where dia = '"+hoje+"';");

Eu estou desconfiado que a configuração de . e , decimal do Windows está atrapalhando isso, pois mesmo a máscara no DecimalFormat sendo 0.00 , quando aparece o número na tela é mostrado 0,00.

Agradeço a atenção.

  1. Por favor, use PreparedStatement e use o método “setDouble” ou “setFloat” para preencher os valores numéricos. Vai evitar muita dor de cabeça.

  2. DecimalFormat.parse e format obedecem às Configurações Regionais do Windows se você não mencionar um “Locale” no construtor de DecimalFormat. Se você mencionar “Locale.US” então vai sempre usar o formato americano, e se usar “new Locale (“pt”, “BR”)” vai usar o formato brasileiro.

vou te ajudar, mas n se acostume muito com ajuda de código pronto


private static final NumberFormat nf = NumberFormat.getCurrencyInstance(BRASIL);
private static final Locale BRASIL = new Locale ("pt", "BR");

//Coloca virgula
public static String formatMoeda(Double d){
        return nf.format (d);
}

//tira a virgula
public static Double formatToDouble(String s){
         try {
	return (nf.parse (s)).doubleValue();
	} catch (ParseException e) {
	    e.printStackTrace();
	}
}
import java.text.DecimalFormat;
import java.text.ParseException;
import java.util.Currency;
import java.util.Locale;

public class Teste
{
    public static void main(String[] args) throws ParseException
    {
        DecimalFormat formater = new DecimalFormat("#.00");
        formater.setCurrency(Currency.getInstance(new Locale("pt", "BR")));
        System.out.println(formater.format(10d)); // vai imprimir 10,00
        System.out.println(formater.parse("15,20")); // vai imprimir 15.2
    }
}

:slight_smile:

Muito obrigado a todo pela ajuda, prometo que vou estudar as sugestões todas e encontrar a melhor e mais profissional forma de lidar com isso, mas por enquanto a solução do sf.marcius me permite usar isso: formater.parse(jT6101.getText()) para obter os valores dos textfields e conseguir gravá-los com . decimal.

Já me salvou o pescoço por hoje, obrigado.

Amanhã estudarei a melhor alternativa para se tornar meu padrão de uso nas próximas telas.

Abraços

[quote=Reciclante]Muito obrigado a todo pela ajuda, prometo que vou estudar as sugestões todas e encontrar a melhor e mais profissional forma de lidar com isso, mas por enquanto a solução do sf.marcius me permite usar isso: formater.parse(jT6101.getText()) para obter os valores dos textfields e conseguir gravá-los com . decimal.

Já me salvou o pescoço por hoje, obrigado.

Amanhã estudarei a melhor alternativa para se tornar meu padrão de uso nas próximas telas.

Abraços[/quote]

tava olhando…

na verdade, eu e o colega cabelograff tivemos a mesma idéia…

fazer

formater.parse(jT6101.getText())

tem o mesmo efeito que fazer

formatToDouble(jT6101.getText())

eu tava editando o codigo qdo ele foi mais rápido no gatilho e postou antes, hehe :slight_smile:

a única diferença é que ele criou uma estrutura especializada para fazer isso.
logo, se vc faz uso frequente desses comandos, a solução do colega é mais prática :slight_smile:

[]s

Descobri uma coisa, usar: formater.parse(jT6101.getText()) não me gera um float ou um double.

vai me resultar um Number e não posso fazer multiplicação ou divisão com ele antes de gravar no BD.

É isso mesmo?

Se gera um Number, você deve transformar esse valor em um double (fazendo um cast), por exemplo, antes de fazer contas:

double valor = (double) formater.parse(jT6101.getText());

Acho que isso ajuda.

[quote=marcobiscaro2112]Se gera um Number, você deve transformar esse valor em um double (fazendo um cast), por exemplo, antes de fazer contas:

double valor = (double) formater.parse(jT6101.getText());

Acho que isso ajuda.[/quote]

Não sei por qual motivo, mas não funcionou isso, eu estou pegando o texto do textfield formatando com . decimal gerando um number, convertendo pra String e depois convertendo pra float para depois dividir pelo número que preciso, tudo isso na linha do update pro BD, funcionou, mas tá dando vergonha o tamanho da linha.
Float.parseFloat(String.valueOf(formater.parse(jT6606.getText())))/1.055056

Por hoje funcionou, amanhã eu estudo uma solução limpa.
Obrigado.