Ajuda Urgente por favor

Boa tarde.
tenho um problema a inserir um valor no banco de dados através de uma Jtextfield.
alguem pode ajudar?
codigo que tenho feito :

NumberFormat nf = NumberFormat.getInstance();
nf.setMinimumFractionDigits(2);

float a;
 
a=(Float.parseFloat(txtutilccaixa.getText()) - Float.parseFloat(txtutilrdt.getText()));
txtutildiferenca.setText(String.valueOf(nf.format(a)));

Erro: Exception in thread “AWT-EventQueue-0” java.lang.NumberFormatException: For input string: "-153,15"
PS: -153,15 é o resultado da soma dá no calculo que estou a fazer

NumberFormatException é uma exceção que está diretamente associada ao valor que se tenta converter em número.
Veja, você tenta converter uma String (txtutlirdt.getText() retorna uma String) em Float (Float.parseFloat). O que ocorre é que os números com ponto flutuante são, para a tua versão da JVM, entendidos como os que contém o ponto (.), ou seja, seguem o padrão inglês, e não a vírgula (,) como o padrão português.
Assim sendo, sugiro que, como forma de evitar tal problema, você faça a conversão depois de substituir a vírgula por ponto.
Como?
Creio que isso funcione:

Float.paserFloat(txtutilrdt.getText().replace("\\.", ","));

Agradeço a Resposta.
mas então retiro o NumberFormat?
Eu coloquei o NumberFormat para me limitar a 2 casas decimais!
agradeço a sua ajuda.
Obrigado

Não, não.
O erro não tem a ver com o NumberFormat.
O que ocorre é que você tem, formatado ou não, uma String que é retornada pelo método getText() do component JTextField e isso nunca mudará.
O problema é que existem diferenças nos padrões inglês e português (inglês faz a separação dos decimais com ponto e português com vírgula).
A única solução para tais divergências é apelar para o replace e substituir a tal vírgula por ponto (quando lendo os dados) e vice-versa quando for apresentar o valor.

está a dar erro igual.
Confirme se o Float.parseFloat(txtutilrdt.getText().replace("\.", “,”)); está correto!
a Primeira virgula não está a faltar umas " "?
eu quero fazer SetText e não getText.
a txtutildiferenca é que vai receber o valor da soma e introduzir na BD
Obrigado

Você está fazendo muitas coisas na mesma linha e está se perdendo.

float a;
String valCaixa = txtutilccaixa.getText();
String valRdt = txtutilrdt.getText();

float rdt = Float.parseFloat(valRdt.replace(".", ","));
float caixa = Float.parseFloat(valCaixa.replace(".", ","));
a = caixa - rdt;
txtutildiferenca.setText(String.valueOf(nf.format(a)));

Fica mais fácil identificar onde está o erro quando você desmembra o que está amontoado.
Não que não funcione empilhado, porém, é mais difícil de determinar o que está com problema.

P.S.: o replace se baseia em regex, logo, replace(".", “,”) pode não funcionar, ok? Será preciso analisar como criar uma regex que identifique o ponto e permita substituir o mesmo por vírgula.

Continua dando erro

Exception in thread “AWT-EventQueue-0” java.lang.NumberFormatException: For input string: "145,36"
at sun.misc.FloatingDecimal.readJavaFormatString(FloatingDecimal.java:2043)
at sun.misc.FloatingDecimal.parseFloat(FloatingDecimal.java:122)

meu codigo:

NumberFormat nf = NumberFormat.getInstance();
nf.setMinimumFractionDigits(2);
float a;
String valCaixa = txtutilccaixa.getText();
String valRdt = txtutilrdt.getText();

float rdt = Float.parseFloat(valRdt.replace(".", “,”));
float caixa = Float.parseFloat(valCaixa.replace(".", “,”));
a = caixa - rdt;
txtutildiferenca.setText(String.valueOf(nf.format(a)));

Desculpe estar a ser chato mas precisava mesmo de resolver isso
Obrigado

Cara, foi mal.
Eu me equivoquei no replace, você quer tirar a vírgula e não o ponto.
O certo será:

.replace(",", “.”);

Isso está correto? confirme porque está a dar erro na linha

O que me parece é que o erro não vem dai
java.lang.NumberFormatException: For input string: “200,29”

Vem de onde então, cara? Se você sabe tanto, por que está perguntando?

public class Replace {
    public static void main(String args[]) {
        String x = "123,44";
        String z = x.replace(",", ".");
        System.out.println(z);
        float w = Float.parseFloat(z);
        System.out.println(z + " " + w);
    }
}

Veja se esse código não compila.

Sim compila
o campo que vai receber o valor da txtutildiferenca na BD é Float!

já coloquei como você disse e continua a dar erro

Me mostre qual a mensagem e em qual linha está ocorrendo o erro.

o erro da linha já resolvi.
o erro que esta a dar é ao inserir o resultado na BD
For input string: "-85,76"
este valor -85,76 é o valor que retoma a txtutildiferenca que vai inserir na bd
pelo que tenho de colocar o .replace na txtutildiferenca

O banco de dados segue o mesmo padrão do java, cara.
Logo, você sim, terá que fazer replace para transformar o valor do padrão português para o inglês.
Faz parte do processo de trabalho de um desenvolvedor pensar.

já alterei isto no botão gravar

mod.setDiferenca (Float.parseFloat(txtutildiferenca.getText().replace("\,", “.”)));
mas mesmo assim nao dá

Faz o seguinte coloca o número no seu campo JTextField com .(ponto), verifica se ainda vai dar o erro, se não der o erro é por conta da vírgula, se der é por outra coisa, e então você vai saber melhor o que está acontecendo e depois como mudar.

Alguém traga um mito para esse oscar. :smiley:

Você quer substituir um único caractere vírgula pelo caractere ponto, não precisa de expressão regular pra isso.

String texto = txtutildiferenca.getText().replace(',', '.');
float valor = Float.parseFloat(texto);
mod.setDiferenca(valor);