Autore Topic: Problema divisione di double  (Letto 1263 volte)

Offline Romulus Slegg

  • Nuovo arrivato
  • *
  • Post: 42
  • Respect: 0
    • Mostra profilo
  • Dispositivo Android:
    Samsung Galaxy S4 GT-i9505
  • Sistema operativo:
    Windows 8
Problema divisione di double
« il: 04 Marzo 2014, 12:53:59 CET »
0
Salve ragazzi io ho un'app con due edit text. Con questo codice effettuo la divisione dei numeri inseriti nei due edit text:
Codice (Java): [Seleziona]
} else if (sign == '/') {
                        Editable a = numberOne.getText();
                        Editable b = numberTwo.getText();
                        String newString = a.toString();
                        String newStringTwo = b.toString();
                        double num = Double.parseDouble(newString);
                        double price = Double.parseDouble(f.format(num));
                        double secondNum = Double.parseDouble(newStringTwo);
                        double price2 = Double.parseDouble(f.format(secondNum));
                        double somma = price / price2;
                        String str = f.format(somma);
                        result.setText(str);
La divisione viene svolta nel modo giusto ma se uso numeri con la virgola si arresta l'app (dimenticavo ke "f" è "NumberFormat f = NumberFormat.getInstance(Locale.ITALY);").
Ecco il logcat
Codice: [Seleziona]
03-04 12:51:13.771: E/AndroidRuntime(21041): FATAL EXCEPTION: main
03-04 12:51:13.771: E/AndroidRuntime(21041): java.lang.IllegalStateException: Could not execute method of the activity
03-04 12:51:13.771: E/AndroidRuntime(21041):         at android.view.View$1.onClick(View.java:3838)
03-04 12:51:13.771: E/AndroidRuntime(21041):         at android.view.View.performClick(View.java:4475)
03-04 12:51:13.771: E/AndroidRuntime(21041):         at android.view.View$PerformClick.run(View.java:18786)
03-04 12:51:13.771: E/AndroidRuntime(21041):         at android.os.Handler.handleCallback(Handler.java:730)
03-04 12:51:13.771: E/AndroidRuntime(21041):         at android.os.Handler.dispatchMessage(Handler.java:92)
03-04 12:51:13.771: E/AndroidRuntime(21041):         at android.os.Looper.loop(Looper.java:137)
03-04 12:51:13.771: E/AndroidRuntime(21041):         at android.app.ActivityThread.main(ActivityThread.java:5419)
03-04 12:51:13.771: E/AndroidRuntime(21041):         at java.lang.reflect.Method.invokeNative(Native Method)
03-04 12:51:13.771: E/AndroidRuntime(21041):         at java.lang.reflect.Method.invoke(Method.java:525)
03-04 12:51:13.771: E/AndroidRuntime(21041):         at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1187)
03-04 12:51:13.771: E/AndroidRuntime(21041):         at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1003)
03-04 12:51:13.771: E/AndroidRuntime(21041):         at dalvik.system.NativeStart.main(Native Method)
03-04 12:51:13.771: E/AndroidRuntime(21041): Caused by: java.lang.reflect.InvocationTargetException
03-04 12:51:13.771: E/AndroidRuntime(21041):         at java.lang.reflect.Method.invokeNative(Native Method)
03-04 12:51:13.771: E/AndroidRuntime(21041):         at java.lang.reflect.Method.invoke(Method.java:525)
03-04 12:51:13.771: E/AndroidRuntime(21041):         at android.view.View$1.onClick(View.java:3833)
03-04 12:51:13.771: E/AndroidRuntime(21041):         ... 11 more
03-04 12:51:13.771: E/AndroidRuntime(21041): Caused by: java.lang.NumberFormatException: Invalid double: "3,5"
03-04 12:51:13.771: E/AndroidRuntime(21041):         at java.lang.StringToReal.invalidReal(StringToReal.java:63)
03-04 12:51:13.771: E/AndroidRuntime(21041):         at java.lang.StringToReal.parseDouble(StringToReal.java:269)
03-04 12:51:13.771: E/AndroidRuntime(21041):         at java.lang.Double.parseDouble(Double.java:295)
03-04 12:51:13.771: E/AndroidRuntime(21041):         at com.windroidis.calculator.MainActivity.equal(MainActivity.java:140)
03-04 12:51:13.771: E/AndroidRuntime(21041):         ... 14 more
Se non capite una parte del codice ditemelo pure.
« Ultima modifica: 04 Marzo 2014, 12:56:02 CET da Romulus Slegg »

Offline Romulus Slegg

  • Nuovo arrivato
  • *
  • Post: 42
  • Respect: 0
    • Mostra profilo
  • Dispositivo Android:
    Samsung Galaxy S4 GT-i9505
  • Sistema operativo:
    Windows 8
Re:Problema divisione di double
« Risposta #1 il: 11 Marzo 2014, 20:42:09 CET »
0
Allora nessuno mi può aiutare?

Offline bradipao

  • Moderatore globale
  • Utente storico
  • *****
  • Post: 4043
  • keep it simple
  • Respect: +567
    • Github
    • Google+
    • bradipao
    • Mostra profilo
  • Dispositivo Android:
    Nexus 5
  • Play Store ID:
    Bradipao
  • Sistema operativo:
    W7
Re:Problema divisione di double
« Risposta #2 il: 11 Marzo 2014, 20:46:46 CET »
0
Il LogCat stesso che tu hai postato...

Citazione
03-04 12:51:13.771: E/AndroidRuntime(21041): Caused by: java.lang.NumberFormatException: Invalid double: "3,5"

...mi suggerisce un'ipotesi: se usi il punto invece della virgola, funziona?
NON rispondo a domande nei messaggi privati
Bradipao @ Play Store

Offline Nicola_D

  • Utente storico
  • *****
  • Post: 2479
  • SBAGLIATO!
  • Respect: +323
    • Github
    • Google+
    • nicoladorigatti
    • Mostra profilo
  • Dispositivo Android:
    Nexus 6p, Nexus 4, Nexus S, Nexus 7(2012)
  • Sistema operativo:
    Windows 7
Re:Problema divisione di double
« Risposta #3 il: 11 Marzo 2014, 20:52:34 CET »
0
Il locale italiano vuole il '.' e non la ','
IMPORTANTE:NON RISPONDO A PROBLEMI VIA MESSAGGIO PRIVATO
LOGCAT: Non sai cos'è? -> Android Debug Bridge | Android Developers
               Dov'è in Eclipse? -> Window -> Open Prospective -> DDMS e guarda in basso!
[Obbligatorio] Logcat, questo sconosciuto! (Gruppo AndDev.it LOGTFO) - Android Developers Italia

Offline arlabs

  • Utente normale
  • ***
  • Post: 430
  • Respect: +49
    • Mostra profilo
  • Dispositivo Android:
    GalaxyS6, Nexus5
  • Play Store ID:
    AR Labs
  • Sistema operativo:
    Windows 10
Re:Problema divisione di double
« Risposta #4 il: 11 Marzo 2014, 22:17:14 CET »
0
Non mi pare che Double.parse dipenda dal Locale.

Secondo me è questa riga che dà problemi:

double price = Double.parseDouble(f.format(num));

Ma non capisco esattamente cosa intendi fare.
num è un double (che vale 3.5)
f.format ti ritorna una stringa "3,5"
Double.parseDouble ti lancia l'eccezione parsando "3,5"

E comunque, attaccandoti con il debugger non ti rendi conto meglio di quello che succede?


Offline Nicola_D

  • Utente storico
  • *****
  • Post: 2479
  • SBAGLIATO!
  • Respect: +323
    • Github
    • Google+
    • nicoladorigatti
    • Mostra profilo
  • Dispositivo Android:
    Nexus 6p, Nexus 4, Nexus S, Nexus 7(2012)
  • Sistema operativo:
    Windows 7
Re:Problema divisione di double
« Risposta #5 il: 12 Marzo 2014, 09:19:45 CET »
0
Non mi pare che Double.parse dipenda dal Locale.

Secondo me è questa riga che dà problemi:

double price = Double.parseDouble(f.format(num));

Ma non capisco esattamente cosa intendi fare.
num è un double (che vale 3.5)
f.format ti ritorna una stringa "3,5"
Double.parseDouble ti lancia l'eccezione parsando "3,5"

E comunque, attaccandoti con il debugger non ti rendi conto meglio di quello che succede?

Potrei anche sbagliarmi, ma Double.parse DOVREBBE dipendere dal Locale in uso, sennò sai che casini a fare il parsing? Tipo 222.223 per chi usa la "," come decimale va letto come 222mila...
credo che l'unica sia cercare un metodo un po standard per fare queste cose (tipo usare l'edit text come numeric)
IMPORTANTE:NON RISPONDO A PROBLEMI VIA MESSAGGIO PRIVATO
LOGCAT: Non sai cos'è? -> Android Debug Bridge | Android Developers
               Dov'è in Eclipse? -> Window -> Open Prospective -> DDMS e guarda in basso!
[Obbligatorio] Logcat, questo sconosciuto! (Gruppo AndDev.it LOGTFO) - Android Developers Italia

Offline arlabs

  • Utente normale
  • ***
  • Post: 430
  • Respect: +49
    • Mostra profilo
  • Dispositivo Android:
    GalaxyS6, Nexus5
  • Play Store ID:
    AR Labs
  • Sistema operativo:
    Windows 10
Re:Problema divisione di double
« Risposta #6 il: 12 Marzo 2014, 10:17:35 CET »
0
Ho provato:

            double d1 = Double.parseDouble("3.5");
non lancia eccezione

            double d2 = Double.parseDouble("3,5");
lancia eccezione

Ma in italiano il separatore dei decimali è la virgola.
Ne da la prova che

            NumberFormat nf = NumberFormat.getInstance(Locale.ITALIAN);
            double d1 = nf.parse("3,5").doubleValue();

non lancia eccezioni.

Da questo dedurrei che Double.parseDouble non usa il Locale corrente (anche perché altrimenti mi aspetteri un overload in cui gli si passa un Locale specifico)

Romulus, continuo a non capire perché prima formatti una stringa a partire da un double per poi riparsare la stringa appena formattata.

Ciao.

Offline Nicola_D

  • Utente storico
  • *****
  • Post: 2479
  • SBAGLIATO!
  • Respect: +323
    • Github
    • Google+
    • nicoladorigatti
    • Mostra profilo
  • Dispositivo Android:
    Nexus 6p, Nexus 4, Nexus S, Nexus 7(2012)
  • Sistema operativo:
    Windows 7
Re:Problema divisione di double
« Risposta #7 il: 12 Marzo 2014, 10:46:01 CET »
0
mmm hai ragione, non usa IL locale di default, ma UN Locale di default, probabilmente l'inglese.... :D
IMPORTANTE:NON RISPONDO A PROBLEMI VIA MESSAGGIO PRIVATO
LOGCAT: Non sai cos'è? -> Android Debug Bridge | Android Developers
               Dov'è in Eclipse? -> Window -> Open Prospective -> DDMS e guarda in basso!
[Obbligatorio] Logcat, questo sconosciuto! (Gruppo AndDev.it LOGTFO) - Android Developers Italia

Offline bradipao

  • Moderatore globale
  • Utente storico
  • *****
  • Post: 4043
  • keep it simple
  • Respect: +567
    • Github
    • Google+
    • bradipao
    • Mostra profilo
  • Dispositivo Android:
    Nexus 5
  • Play Store ID:
    Bradipao
  • Sistema operativo:
    W7
Re:Problema divisione di double
« Risposta #8 il: 12 Marzo 2014, 11:35:06 CET »
0
mmm hai ragione, non usa IL locale di default, ma UN Locale di default, probabilmente l'inglese.... :D

Incuriosito sono andato a vedermi la classe Double e quelle che vengono richiamate all'interno. Se non ho visto male, il punto "." è hardcoded nel codice, senza nessun riferimento al locale.
NON rispondo a domande nei messaggi privati
Bradipao @ Play Store

Offline undead

  • Utente senior
  • ****
  • Post: 666
  • Respect: +113
    • Mostra profilo
  • Dispositivo Android:
    Samsung Galaxy S6
  • Play Store ID:
    DrKappa
  • Sistema operativo:
    Windows 10 64-bit, Windows 8.1 64-bit
Re:Problema divisione di double
« Risposta #9 il: 12 Marzo 2014, 11:40:02 CET »
0
Incuriosito sono andato a vedermi la classe Double e quelle che vengono richiamate all'interno. Se non ho visto male, il punto "." è hardcoded nel codice, senza nessun riferimento al locale.
A parer mio meglio così...  ;-)

Offline arlabs

  • Utente normale
  • ***
  • Post: 430
  • Respect: +49
    • Mostra profilo
  • Dispositivo Android:
    GalaxyS6, Nexus5
  • Play Store ID:
    AR Labs
  • Sistema operativo:
    Windows 10
Re:Problema divisione di double
« Risposta #10 il: 12 Marzo 2014, 12:17:47 CET »
0
A parer mio meglio così...  ;-)

Son d'accordo.
Mi è capitato troppe volte che qualcosa non funzionasse perché qualche file XML, formattato automaticamente nel locale, in cui era stato creato non funzionasse su qualche altro PC (tipo caso, client-server con impostazioni differenti)
Magari per una sola dimenticanza di un Locale.Invariant

Offline Romulus Slegg

  • Nuovo arrivato
  • *
  • Post: 42
  • Respect: 0
    • Mostra profilo
  • Dispositivo Android:
    Samsung Galaxy S4 GT-i9505
  • Sistema operativo:
    Windows 8
Re:Problema divisione di double
« Risposta #11 il: 12 Marzo 2014, 13:35:12 CET »
0
Allora mi sono un po' confuso con tutti questi messaggi, quindi comincio rispondendo al primo di bradipao. Non so come mai ma ricordavo ke eseguendo un'operazione del tipo 5.5 / 5.5 in java si verificasse un problema e ke bisognasse scrivere 5,5 / 5,5 (poi ho verificato ke non è così). Allora sul codice di questa mia app avevo messo un'operazione del tipo 5.5 / 5.5 e l'app si arrestava in modo anomalo (e qui rispondo al messaggio di bradipao: usando il punto non risolvo il problema). Poi ho provato a eseguire l'operazione usando il number format ITALY che dovrebbe scrivere il numero con la virgola anziché col punto ma non ho risolto nulla

Offline bradipao

  • Moderatore globale
  • Utente storico
  • *****
  • Post: 4043
  • keep it simple
  • Respect: +567
    • Github
    • Google+
    • bradipao
    • Mostra profilo
  • Dispositivo Android:
    Nexus 5
  • Play Store ID:
    Bradipao
  • Sistema operativo:
    W7
Re:Problema divisione di double
« Risposta #12 il: 12 Marzo 2014, 13:47:38 CET »
0
Allora mi sono un po' confuso con tutti questi messaggi, quindi comincio rispondendo al primo di bradipao. Non so come mai ma ricordavo ke eseguendo un'operazione del tipo 5.5 / 5.5 in java si verificasse un problema e ke bisognasse scrivere 5,5 / 5,5 (poi ho verificato ke non è così). Allora sul codice di questa mia app avevo messo un'operazione del tipo 5.5 / 5.5 e l'app si arrestava in modo anomalo (e qui rispondo al messaggio di bradipao: usando il punto non risolvo il problema). Poi ho provato a eseguire l'operazione usando il number format ITALY che dovrebbe scrivere il numero con la virgola anziché col punto ma non ho risolto nulla

5.5 / 5.5 numericamente deve funzionare per forza. Si ti genera un crash, posta il LogCat che scopriamo quale altro problema genera.
NON rispondo a domande nei messaggi privati
Bradipao @ Play Store

Offline Romulus Slegg

  • Nuovo arrivato
  • *
  • Post: 42
  • Respect: 0
    • Mostra profilo
  • Dispositivo Android:
    Samsung Galaxy S4 GT-i9505
  • Sistema operativo:
    Windows 8
Re:Problema divisione di double
« Risposta #13 il: 12 Marzo 2014, 13:55:01 CET »
0
Codice: [Seleziona]
03-12 13:53:30.535: E/AndroidRuntime(7964): FATAL EXCEPTION: main
03-12 13:53:30.535: E/AndroidRuntime(7964): java.lang.IllegalStateException: Could not execute method of the activity
03-12 13:53:30.535: E/AndroidRuntime(7964):         at android.view.View$1.onClick(View.java:3838)
03-12 13:53:30.535: E/AndroidRuntime(7964):         at android.view.View.performClick(View.java:4475)
03-12 13:53:30.535: E/AndroidRuntime(7964):         at android.view.View$PerformClick.run(View.java:18786)
03-12 13:53:30.535: E/AndroidRuntime(7964):         at android.os.Handler.handleCallback(Handler.java:730)
03-12 13:53:30.535: E/AndroidRuntime(7964):         at android.os.Handler.dispatchMessage(Handler.java:92)
03-12 13:53:30.535: E/AndroidRuntime(7964):         at android.os.Looper.loop(Looper.java:137)
03-12 13:53:30.535: E/AndroidRuntime(7964):         at android.app.ActivityThread.main(ActivityThread.java:5419)
03-12 13:53:30.535: E/AndroidRuntime(7964):         at java.lang.reflect.Method.invokeNative(Native Method)
03-12 13:53:30.535: E/AndroidRuntime(7964):         at java.lang.reflect.Method.invoke(Method.java:525)
03-12 13:53:30.535: E/AndroidRuntime(7964):         at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1187)
03-12 13:53:30.535: E/AndroidRuntime(7964):         at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1003)
03-12 13:53:30.535: E/AndroidRuntime(7964):         at dalvik.system.NativeStart.main(Native Method)
03-12 13:53:30.535: E/AndroidRuntime(7964): Caused by: java.lang.reflect.InvocationTargetException
03-12 13:53:30.535: E/AndroidRuntime(7964):         at java.lang.reflect.Method.invokeNative(Native Method)
03-12 13:53:30.535: E/AndroidRuntime(7964):         at java.lang.reflect.Method.invoke(Method.java:525)
03-12 13:53:30.535: E/AndroidRuntime(7964):         at android.view.View$1.onClick(View.java:3833)
03-12 13:53:30.535: E/AndroidRuntime(7964):         ... 11 more
03-12 13:53:30.535: E/AndroidRuntime(7964): Caused by: java.lang.NumberFormatException: Invalid double: "5,5"
03-12 13:53:30.535: E/AndroidRuntime(7964):         at java.lang.StringToReal.invalidReal(StringToReal.java:63)
03-12 13:53:30.535: E/AndroidRuntime(7964):         at java.lang.StringToReal.parseDouble(StringToReal.java:269)
03-12 13:53:30.535: E/AndroidRuntime(7964):         at java.lang.Double.parseDouble(Double.java:295)
03-12 13:53:30.535: E/AndroidRuntime(7964):         at com.windroidis.calculator.MainActivity.equal(MainActivity.java:144)
03-12 13:53:30.535: E/AndroidRuntime(7964):         ... 14 more
Mi sa ke ho sbagliato logcat, non ho proprio tempo per ora. Stasera posto il logcat giusto
« Ultima modifica: 12 Marzo 2014, 15:01:19 CET da Romulus Slegg »

Offline arlabs

  • Utente normale
  • ***
  • Post: 430
  • Respect: +49
    • Mostra profilo
  • Dispositivo Android:
    GalaxyS6, Nexus5
  • Play Store ID:
    AR Labs
  • Sistema operativo:
    Windows 10
Re:Problema divisione di double
« Risposta #14 il: 12 Marzo 2014, 14:59:31 CET »
0
Scusate, non vorrei insistere.

Ma la linea

double price = Double.parseDouble(f.format(num));

effettua un operazione che, oltre a parermi inutile (se così non è per favore delucidatemi), può generare il crash.
Fa una doppia conversione double->string->double

La conversione double->string è con NumericFormat con separatore decimale "," (immagino, visto il crash, ma comunque dipende da 'f', che nel codice non è chiaro che cosa sia)
La conversione string->double è con separatore decimale "."

Continuo a ritenere che il problema sia lì.

Ciao.