NumberFormat błędy

0

Mam problem z klasą NumberFormat.

Najpierw mam zmienne ilosc, cena_netto oraz stawka_vat którym przypisuje przeparsowane do double stringi które są wartościami z textFieldów do których wartość wpisuje użytkownik.

Za pomocą metody replace zamieniam ' , ' na ' . '

Następnie te zmienne chciałbym wysłać do bazy i zaprezentować w tabeli jTable, ale nie to jest problemem.

Problem tkwi w tym żeby np. taka wartość 89.93942879 była prezentowana w tabeli jako 89.94

użyłem do tego klasy NumberFormat ale niestety powoduje to błędy.

Co jest nie tak w tym kodzie.
Z góry dzięki za jakąś pomoc.

Poniżej kod źródłowy metody w której jest błąd oraz kod błędu.


private void jButton1ActionPerformed(java.awt.event.ActionEvent evt) {                                         
            
        
        
        
        double ilosc = Double.parseDouble(jTextField19.getText().toString().replace(',', '.'));
        double cena_netto = Double.parseDouble(jTextField21.getText().toString().replace(',', '.'));
        double stawka_vat = Double.parseDouble(jTextField22.getText().toString().replace(',', '.'));
        
       
        NumberFormat n1 = NumberFormat.getInstance();
        n1.setMinimumFractionDigits(2);
        n1.setMaximumFractionDigits(2);
        String n1s = n1.format(ilosc).replace(',', '.');
        ilosc = Double.parseDouble(n1s);
        
        
        
        NumberFormat n2 = NumberFormat.getInstance();
        n2.setMinimumFractionDigits(2);
        n2.setMaximumFractionDigits(2);
        String n2s = n2.format(cena_netto).replace(',', '.');
        cena_netto = Double.parseDouble(n2s);
        
        
        
        NumberFormat n3 = NumberFormat.getInstance();
        n3.setMinimumFractionDigits(2);
        n3.setMaximumFractionDigits(2);
        String n3s = n3.format(stawka_vat).replace(',', '.');
        stawka_vat = Double.parseDouble(n3s);
        
        
       
        
        
        
        double wartosc_netto = cena_netto * ilosc;
        double kwota_vat = wartosc_netto * stawka_vat * 0.01;
        double wartosc_brutto = wartosc_netto + kwota_vat;
        
       
        NumberFormat n4 = NumberFormat.getInstance();
        n4.setMinimumFractionDigits(2);
        n4.setMaximumFractionDigits(2);
        String n4s = n4.format(wartosc_netto).replace(',','.');
        wartosc_netto = Double.parseDouble(n4s);
        
        
        NumberFormat n5 = NumberFormat.getInstance();
        n5.setMaximumFractionDigits(2);
        n5.setMinimumFractionDigits(2);
        String n5s = n5.format(kwota_vat).replace(',','.');
        kwota_vat = Double.parseDouble(n5s);
        
        NumberFormat n6 = NumberFormat.getInstance();
        n6.setMinimumFractionDigits(2);
        n6.setMaximumFractionDigits(2);
        String n6s = n6.format(wartosc_brutto).replace(',','.');
        wartosc_brutto = Double.parseDouble(n6s);
        
        
        
 
        
        
        
        
        try {

            String sql = "insert into Faktura(lp, nazwa, kod, pkwiu, ilosc, jm, cena_netto, wartosc_netto, stawka_vat, kwota_vat, wartosc_brutto) values (?,?,?,?,?,?,?,?,?,?,?)";
            pst = conn.prepareStatement(sql);
            pst.setString(1, jTextField15.getText()); // lp
            pst.setString(2, jTextField16.getText()); // nazwa
            pst.setString(3, jTextField17.getText()); // kod
            pst.setString(4, jTextField18.getText()); // pkwiu
            pst.setDouble(5, ilosc); // ilość
            pst.setString(6, jTextField20.getText()); // jm
            pst.setDouble(7, cena_netto); // cena_netto
            pst.setDouble(8, wartosc_netto); // wartość_netto
            pst.setDouble(9, stawka_vat); // stawka_vat
            pst.setDouble(10, kwota_vat); // kwota_vat
            pst.setDouble(11, wartosc_brutto); // wartosc_brutto
            pst.execute();
            JOptionPane.showMessageDialog(null, "Dodano poprawnie");

        } catch (Exception e) {
        } finally {
            try {
                rs.close();
                pst.close();
            } catch (Exception e) {
            }
        }
        Update_table();

      
         

    }                    








Exception in thread "AWT-EventQueue-0" java.lang.NumberFormatException: For input string: "2 357.98"
	at sun.misc.FloatingDecimal.readJavaFormatString(FloatingDecimal.java:1241)
	at java.lang.Double.parseDouble(Double.java:540)
	at logowanie.DaneDoFakturyVAT2.jButton1ActionPerformed(DaneDoFakturyVAT2.java:1055)
	at logowanie.DaneDoFakturyVAT2.access$400(DaneDoFakturyVAT2.java:42)
	at logowanie.DaneDoFakturyVAT2$5.actionPerformed(DaneDoFakturyVAT2.java:343)
	at javax.swing.AbstractButton.fireActionPerformed(AbstractButton.java:2018)
	at javax.swing.AbstractButton$Handler.actionPerformed(AbstractButton.java:2341)
	at javax.swing.DefaultButtonModel.fireActionPerformed(DefaultButtonModel.java:402)
	at javax.swing.DefaultButtonModel.setPressed(DefaultButtonModel.java:259)
	at javax.swing.plaf.basic.BasicButtonListener.mouseReleased(BasicButtonListener.java:252)
	at java.awt.Component.processMouseEvent(Component.java:6505)
	at javax.swing.JComponent.processMouseEvent(JComponent.java:3320)
	at java.awt.Component.processEvent(Component.java:6270)
	at java.awt.Container.processEvent(Container.java:2229)
	at java.awt.Component.dispatchEventImpl(Component.java:4861)
	at java.awt.Container.dispatchEventImpl(Container.java:2287)
	at java.awt.Component.dispatchEvent(Component.java:4687)
	at java.awt.LightweightDispatcher.retargetMouseEvent(Container.java:4832)
	at java.awt.LightweightDispatcher.processMouseEvent(Container.java:4492)
	at java.awt.LightweightDispatcher.dispatchEvent(Container.java:4422)
	at java.awt.Container.dispatchEventImpl(Container.java:2273)
	at java.awt.Window.dispatchEventImpl(Window.java:2719)
	at java.awt.Component.dispatchEvent(Component.java:4687)
	at java.awt.EventQueue.dispatchEventImpl(EventQueue.java:735)
	at java.awt.EventQueue.access$200(EventQueue.java:103)
	at java.awt.EventQueue$3.run(EventQueue.java:694)
	at java.awt.EventQueue$3.run(EventQueue.java:692)
	at java.security.AccessController.doPrivileged(Native Method)
	at java.security.ProtectionDomain$1.doIntersectionPrivilege(ProtectionDomain.java:76)
	at java.security.ProtectionDomain$1.doIntersectionPrivilege(ProtectionDomain.java:87)
	at java.awt.EventQueue$4.run(EventQueue.java:708)
	at java.awt.EventQueue$4.run(EventQueue.java:706)
	at java.security.AccessController.doPrivileged(Native Method)
	at java.security.ProtectionDomain$1.doIntersectionPrivilege(ProtectionDomain.java:76)
	at java.awt.EventQueue.dispatchEvent(EventQueue.java:705)
	at java.awt.EventDispatchThread.pumpOneEventForFilters(EventDispatchThread.java:242)
	at java.awt.EventDispatchThread.pumpEventsForFilter(EventDispatchThread.java:161)
	at java.awt.EventDispatchThread.pumpEventsForHierarchy(EventDispatchThread.java:150)
	at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:146)
	at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:138)
	at java.awt.EventDispatchThread.run(EventDispatchThread.java:91)

0

po wprowadzeniu liczby usuń jeszcze z niej spacje.

0

Wpisywana jest normalnie liczba np. 1259.90 bez żadnych spacji i są takie błędy.

0

Nie ma żadnego znaczenia jak są wpisywane liczby.

NumberFormat n1 = NumberFormat.getInstance();
...
String n1s = n1.format(ilosc).replace(',', '.'); //ten wiersz formatuje (wprowadza separatory co trzy cyfry)

Inna sprawa, jak wprowadzam dane do bazy, to oczekuję komunikatu jak coś pójdzie źle. Komunikat, że się udało jest denerwujący. U Ciebie jest na odwrót, cisza jak wystąpi błąd, komunikat jak się uda.
Właściwie cały zamieszczony przez Ciebie kod jest dziwny:

  • wielokrotne konwersje: tekst => liczba => tekst => liczba
  • jeśli te konwersje są konieczne (ja w to nie wierzę), to po co wielokrotnie piszesz taki sam kod i wielokrotnie tworzysz identyczne obiekty typu NumberFormat, poniższe rozwiązanie jest dużo lepsze i dużo krótsze:
private double sformatuj(String text, NumberFormat nf)
{
     text = text.trim().replace(',','.');
     String s = nf.format(Double.parseDouble(text)).replace(',','.'));
     return Double.parseDouble(s);
}
private double sformatuj(double value, NumberFormat nf)
{
     String s = nf.format(value);
     return Double.parseDouble(s);
}
...
NumberFormat nf = NumberFormat.getInstance();
nf.setMinimumFractionDigits(2);
nf.setMaximumFractionDigits(2);
double ilosc = sformatuj(jTextField19.getText(),nf);
double cena_netto = sformatuj(jTextField21.getText(),nf);
double stawka_vat = sformatuj(jTextField22.getText(),nf);
double wartosc_netto = sformatuj(cena_netto * ilosc,nf);
double kwota_vat = sformatuj(wartosc_netto * stawka_vat * 0.01,nf);
double wartosc_brutto = sformatuj(wartosc_netto + kwota_vat,nf);
  • getText().toString() daje taki sam wynik jak getText(), tzn. wywołanie toString() jest całkowicie zbędne, wywołuj natomiast funkcję trim gestText().trim(), nie jest ona konieczna przy konwersji na typy zmiennoprzecinkowe, ale Integer.parseInt("123 ") rzuci wyjątkiem.
0

Przebudowałem kod w taki sposób:

 private double sformatuj(String text, NumberFormat nf) {
        text = text.trim().replace(',', '.');
        String s = nf.format(Double.parseDouble(text));
        
        return Double.parseDouble(s.replace(',', '.'));
    }
    
    
    private double sformatuj(double value, NumberFormat nf) {
        String s = nf.format(value);
        return Double.parseDouble(s);
    }

    
    private void jButton1ActionPerformed(java.awt.event.ActionEvent evt) {                                         
        NumberFormat nf = NumberFormat.getInstance();
        nf.setMinimumFractionDigits(2);
        nf.setMaximumFractionDigits(2);
        
        double ilosc = sformatuj(jTextField19.getText(), nf);
        double cena_netto = sformatuj(jTextField21.getText(), nf);
        double stawka_vat = sformatuj(jTextField22.getText(), nf);
        double wartosc_netto = sformatuj(cena_netto * ilosc, nf);
        double kwota_vat = sformatuj(wartosc_netto * stawka_vat * 0.01, nf);
        double wartosc_brutto = sformatuj(wartosc_netto + kwota_vat, nf);
        
        
        
        

        zm1 = zm1 + jTextField15.getText() + ";";
        zm2 = zm2 + jTextField16.getText() + ";";
        zm3 = zm3 + jTextField17.getText() + ";";
        zm4 = zm4 + jTextField18.getText() + ";";
        zm5 = zm5 + jTextField19.getText() + ";";
        zm6 = zm6 + jTextField20.getText() + ";";
        zm7 = zm7 + jTextField21.getText() + ";";
        zm8 = zm8 + String.valueOf(wartosc_netto) + ";";
        zm9 = zm9 + jTextField22.getText() + ";";
        zm10 = zm10 + String.valueOf(kwota_vat) + ";";
        zm11 = zm11 + String.valueOf(wartosc_brutto) + ";";
        
        
        
        
        try {

            String sql = "insert into Faktura(lp, nazwa, kod, pkwiu, ilosc, jm, cena_netto, wartosc_netto, stawka_vat, kwota_vat, wartosc_brutto) values (?,?,?,?,?,?,?,?,?,?,?)";
            pst = conn.prepareStatement(sql);
            pst.setString(1, jTextField15.getText()); // lp
            pst.setString(2, jTextField16.getText()); // nazwa
            pst.setString(3, jTextField17.getText()); // kod
            pst.setString(4, jTextField18.getText()); // pkwiu
            pst.setDouble(5, ilosc); // ilość
            pst.setString(6, jTextField20.getText()); // jm
            pst.setDouble(7, cena_netto); // cena_netto
            pst.setDouble(8, wartosc_netto); // wartość_netto
            pst.setDouble(9, stawka_vat); // stawka_vat
            pst.setDouble(10, kwota_vat); // kwota_vat
            pst.setDouble(11, wartosc_brutto); // wartosc_brutto
            pst.execute();
            JOptionPane.showMessageDialog(null, "Dodano poprawnie");

        } catch (Exception e) {
            JOptionPane.showMessageDialog(null, "Wystąpił błąd");
        } finally {
            try {
                rs.close();
                pst.close();
            } catch (Exception e) {
            }
        }
        Update_table();

        try
        {
            String sql = "select sum(wartosc_netto), sum(wartosc_brutto) from Faktura";
            pst = conn.prepareStatement(sql);
            rs = pst.executeQuery();
            String add1 = rs.getString("sum(wartosc_netto)");
            String add2 = rs.getString("sum(wartosc_brutto)");
            sumaNettoTextField.setText(add1 + "zł");
            sumaBruttoTextField.setText(add2 + "zł");
        
        }
        catch(Exception e)
        {
            JOptionPane.showMessageDialog(null, e);
        }
        finally{
            try{
                rs.close();
                pst.close();
            }catch(Exception e)
            {
                
            }
        
        
        }
         

    }                     



niestety nadal są błędy:


Exception in thread "AWT-EventQueue-0" java.lang.NumberFormatException: For input string: "8,00"
	at sun.misc.FloatingDecimal.readJavaFormatString(FloatingDecimal.java:1241)
	at java.lang.Double.parseDouble(Double.java:540)
	at logowanie.DaneDoFakturyVAT1.sformatuj(DaneDoFakturyVAT1.java:1042)
	at logowanie.DaneDoFakturyVAT1.jButton1ActionPerformed(DaneDoFakturyVAT1.java:1054)
	at logowanie.DaneDoFakturyVAT1.access$400(DaneDoFakturyVAT1.java:42)
	at logowanie.DaneDoFakturyVAT1$5.actionPerformed(DaneDoFakturyVAT1.java:340)
	at javax.swing.AbstractButton.fireActionPerformed(AbstractButton.java:2018)
	at javax.swing.AbstractButton$Handler.actionPerformed(AbstractButton.java:2341)
	at javax.swing.DefaultButtonModel.fireActionPerformed(DefaultButtonModel.java:402)
	at javax.swing.DefaultButtonModel.setPressed(DefaultButtonModel.java:259)
	at javax.swing.plaf.basic.BasicButtonListener.mouseReleased(BasicButtonListener.java:252)
	at java.awt.Component.processMouseEvent(Component.java:6505)
	at javax.swing.JComponent.processMouseEvent(JComponent.java:3320)
	at java.awt.Component.processEvent(Component.java:6270)
	at java.awt.Container.processEvent(Container.java:2229)
	at java.awt.Component.dispatchEventImpl(Component.java:4861)
	at java.awt.Container.dispatchEventImpl(Container.java:2287)
	at java.awt.Component.dispatchEvent(Component.java:4687)
	at java.awt.LightweightDispatcher.retargetMouseEvent(Container.java:4832)
	at java.awt.LightweightDispatcher.processMouseEvent(Container.java:4492)
	at java.awt.LightweightDispatcher.dispatchEvent(Container.java:4422)
	at java.awt.Container.dispatchEventImpl(Container.java:2273)
	at java.awt.Window.dispatchEventImpl(Window.java:2719)
	at java.awt.Component.dispatchEvent(Component.java:4687)
	at java.awt.EventQueue.dispatchEventImpl(EventQueue.java:735)
	at java.awt.EventQueue.access$200(EventQueue.java:103)
	at java.awt.EventQueue$3.run(EventQueue.java:694)
	at java.awt.EventQueue$3.run(EventQueue.java:692)
	at java.security.AccessController.doPrivileged(Native Method)
	at java.security.ProtectionDomain$1.doIntersectionPrivilege(ProtectionDomain.java:76)
	at java.security.ProtectionDomain$1.doIntersectionPrivilege(ProtectionDomain.java:87)
	at java.awt.EventQueue$4.run(EventQueue.java:708)
	at java.awt.EventQueue$4.run(EventQueue.java:706)
	at java.security.AccessController.doPrivileged(Native Method)
	at java.security.ProtectionDomain$1.doIntersectionPrivilege(ProtectionDomain.java:76)
	at java.awt.EventQueue.dispatchEvent(EventQueue.java:705)
	at java.awt.EventDispatchThread.pumpOneEventForFilters(EventDispatchThread.java:242)
	at java.awt.EventDispatchThread.pumpEventsForFilter(EventDispatchThread.java:161)
	at java.awt.EventDispatchThread.pumpEventsForHierarchy(EventDispatchThread.java:150)
	at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:146)
	at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:138)
	at java.awt.EventDispatchThread.run(EventDispatchThread.java:91)

0

Nie wiem, który wiersz ma numer 1042. Chyba zapomniałem o replace

private double sformatuj(double value, NumberFormat nf)
{
     String s = nf.format(value).replace(',','.');
     return Double.parseDouble(s);
}

Nie możesz mojego kodu wziąć bez zmiany. Jak liczba będzie miała cztery cyfry przed przecinkiem to pojawi się błąd, bo funkcja format wstawi separator.

0

Ogólnie to jest ok, dzięki za pomoc :)
Tylko u mnie coś nie działa metoda trim rozumiem że ona np. z liczby 3 228.95 robi liczbę 3228.95

public class KlasaDoProb {
    public static void main(String[] args)
    {
        String a = "73839.83839";
        String b = "73839,83839";
        
        System.out.println(a);
        System.out.println(Double.parseDouble(b.replace(',', '.')));
        
        double c = Double.parseDouble(b.replace(',', '.'));
        
        System.out.println(c + " - to jest dopiero moja wartość typu double");
        
        System.out.println("----------------");
        
        NumberFormat number = NumberFormat.getInstance();
        
        number.setMinimumFractionDigits(2);
        number.setMinimumFractionDigits(2);
        
        String d = number.format(c).replace(',', '.').trim();
        
        
        System.out.println(d);
        
        
        
        
    }
}

i wynik z konsoli:

run:
73839.83839
73839.83839
73839.83839 - to jest dopiero moja wartość typu double
----------------
73 839.838
BUILD SUCCESSFUL (total time: 0 seconds)

1 użytkowników online, w tym zalogowanych: 0, gości: 1