Newsgroup: it.comp.java
Titolo: difficoltà di inserimento db

....
pst=conn.prepareStatement(sql);
double valorericevuta;
String p=txtImporto.getText();
valorericevuta=Double.parseDouble(p);
....
pst.setDouble(4,valorericevuta);
....
 
Si tratta di database HSQLDB, il campo 4 è un double (precisione doppia)
Il database senza la riga d'inserimento 4 funziona benissimo, ergo 
qualcosa non va nell'inserimento di "valorericevuta", ma non viene 
segnalato alcun errore, semplicemente non viene memorizzata la riga.
 
Dove sbaglio?
-- 
Gulp®
(forse mi sono perso qualcosa :))


In base a quello che hai postato va tutto bene, evidentemente sbagli 
altrove.
1) Cosa c'e' in sql?
2) Cosa c'e' in p?
3) Dopo pst.setDouble, cosa c'e'?

 3) Dopo pst.setDouble, cosa c'e'?
 
Ciao Ugo, buona giornata. Ed è una buona giornata perchè da stamattina 
il record viene salvato, ma c'è ancora un problema e probabilmente di 
parsing...
 
ma comunque per correttezza, siccome poi sai fare bene le pulci ai 
difetti di codice, approfitto, dunque nell'ordine:
 
1) sql ="INSERT INTO \"ricevute\" (CONDATA,NRIC,NOMINATIVO,EURO) 
VALUES(?,?,?,?)";
 
2)p è un importo ed essendo digitato in euro può essere ad es. 550, ma 
anche 550,50
   nel primo caso mi sono accorto che una volta salvato diventa 550,00
   nel secondo caso invece:
 
   Exception in thread "AWT-EventQueue-0" 
java.lang.NumberFormatException: For input string: "500,50"
	at sun.misc.FloatingDecimal.readJavaFormatString(Unknown Source)
	at sun.misc.FloatingDecimal.parseDouble(Unknown Source)
	at java.lang.Double.parseDouble(Unknown Source)
	at RiceSan.txtImportoFocusLost(RiceSan.java:619)
 
per completezza:
	 String p=txtImporto.getText();
         if (p.length()>0){
            valorericevuta=Double.parseDouble(p);
 
Allora devo verificare se inserisco un intero o un decimale!!!!! prima 
di fare il parsing!!!!!  :)
 
3) A questo punto non serve, ma la riga successiva è  pst.executeUpdate();
 
Ah, nel frattempo, sempre molte grazie per la tua disponibilità e 
pazienza, sto trasformando il gestionale del mio studio da VB in Java e 
ci sto mettendo molta passione, ma da autodidatta ho chiaramente molte 
falle e faccio quindi molta fatica.


 di fare il parsing!!!!!  :)
 
no devi usare DecimalFormat per fare il parsing:
http://goo.gl/44f7bD
 
Double.parseDouble semplicemente non è localizzato ergo non accetta la
virgola decimale.


 
Ok, grazie, proverò con DecimalFormat.


  DecimalFormat formatterIT = new DecimalFormat();
  DecimalFormatSymbols symbols = new DecimalFormatSymbols();
  symbols.setDecimalSeparator(',');
  symbols.setGroupingSeparator('.');
  formatterIT.setDecimalFormatSymbols(symbols);
  Double   valorericevuta = formatterIT.parse(p).doubleValue();
 
Ancora non funziona. Qualcosa da cambiare?


 Ancora non funziona. Qualcosa da cambiare?
 
c'è l'esempio in testa alla documentazione. in ogni caso questa è la
pappa scodellata:
http://goo.gl/EgpbD3
 
 


Non è la strada giusta. O segui la strada che ti prospetta rootkit, ma 
devi essere certo che l'utente inserisca i numeri con il formato 
previsto dalla Locale.
Oppure invece di un JTextField, utilizzi un JFormattedTextField. Questo 
tipo (che estende JTextField, quindi ha gli stessi metodi) ha la 
proprietà di installarsi un formatter adatto, ad esempio:
JFormattedTextField ftf = new JFormattedTextField();
    ftf.setValue(Double.valueOf(0d);
oppure
JFormattedTextField ftf = new JFormattedTextField(Double.valueOf(0d));
 
e usi un InputVerifier per forzare l'utente ad inserire numeri validi:
 
    ftf.setInputVerifier(new InputVerifier() {
      public boolean verify(JComponent input) {
              JFormattedTextField ftf = (JFormattedTextField)input;
              AbstractFormatter formatter = ftf.getFormatter();
              String text = ftf.getText();
              try {
                  formatter.stringToValue(text);
                  return true;
              } catch (Exception e) {
                  return false;
              }
           }
           return true;
      }
      public boolean shouldYieldFocus(JComponent input) {
          return verify(input);
      }
   });
In questo modo l'utente non riesce a portare il focus in un altro campo 
finche' non ha inserito un numero previsto dal formatter creato la prima 
volta che utilizzi setValue().
 
In alternativa, puoi utilizzare:
Double numero = null;
  try {
    ftf.commitEdit();
    numero = (Double)ftf.getValue()
// valore valido
  } catch (Exception e) {
// valore non valido
  }
pero' in questo caso controlli solo il valore ma devi arrangiarti a 
notificare l'utente circa il formato errato.
 
Il JFormattedTextField ha anche un costruttore che accetta un Format, ad 
esempio:
JFormattedTextField ftf =
   new JFormattedTextField(new SimpleDateFormat("yyyy-DD-mm"));
per verificare le date, ed analogamente un DecimalFormat per verificare 
i numeri. Particolarmente consigliato per le date, in quanto possono 
essere formattate in mille modi diversi, e qui ne scegli solo uno 
specifico. Nel caso tu voglia permettere più formati di data, potresti 
valutarli tramite l'input verifier vatutando altrettanti 
SimpleDateFormat con diversi pattern. Ad esempio:
 
public static final SimpleDateFormat
	ISO = new SimpleDateFormat("yyyy-DD-mm"),
         USA = new SimpleDateFormat("mm/DD/yyyy"),
         EUR = new SimpleDateFormat("DD.mm.yyyy"),
         DMY = new SimpleDateFormat("DD/mm/yy");
 
...
 
public boolean verify(JComponent input) {
   JFormattedTextField ftf = (JFormattedTextField)input;
   SimpleDateFormat[] formats =
      new SimpleDateFormat [] {ISO, USA, EUR, DMY};
   String text = ftf.getText();
   boolean verified = false;
   for(int f = 0; f < formats.lenght && !verified; f++)
     try {
       formats[f].parse(text);
       verified =  true;
     } catch (Exception e) {}
   return verified;
}
 
 

Il 19/04/15 12:07, rootkit ha scritto:

  NumberFormat nf = NumberFormat.getInstance(Locale.ITALY);
  valorericevuta = nf.parse(p).doubleValue();
 
Se digito 250 mi ritorna 250.0


La soluzione che ho adottato e che funziona è la seguente:
 
DecimalFormat formatterIT = new DecimalFormat("#,##0.00");
formatterIT.setGroupingSize(3);
valorericevuta = formatterIT.parse(p).doubleValue();


 pappa scodellata:
 
Non mi piace molto. :)
 
Grazie sempre comunque del tuo contributo.


   NumberFormat nf = NumberFormat.getInstance(Locale.ITALY);
 
che se uno non usa il layout italiano non funziona.
conviene usare quello dell'OS. Guarda la classe Locale.
 
Ciao Jack
-- 
Yoda of Borg am I! Assimilated shall you be! Futile resistance is, hmm?

 conviene usare quello dell'OS. Guarda la classe Locale.
 
a lui, in quel contesto, serve il locale italiano. poi si può discutere
quanto vuoi su come si internazionalizzano le applicazioni, ma a lui
non serve questo anzi lo manderebbe in ulteriore confusione.