Problema con programma di conversione di tipo (Java)

di il
13 risposte

Problema con programma di conversione di tipo (Java)

Ciao a tutti, mi sono approcciato da pochissimo allo studio di Java e non riesco a capire perchè il mio seguente programma non funzioni correttamente:
/* 
1)Utilizzare Scanner per leggere un numero in virgola mobile x.
2)Convertire x in un valore intero e memorizzarlo in y.
3)Visualizzare in maniera distinta x e y.
4)Convertire x in un valore di tipo byte e memorizzare il risultato in z.
5)Visualizzare in maniera distinta x e z.
*/

import java.util.Scanner;

public class Esercizio2 {

	public static void main(String[] args) {
		
		Scanner keyboard = new Scanner(System.in);
		
		double x;
		int y;
		byte z;
		
		//Passo 1:
		System.out.print("Inserisci un numero reale: ");
		x = keyboard.nextDouble();
		
		//Passo 2:
		y = (int) x;
		
		//Passo 3:
		System.out.print("x = " + x);
		System.out.print("\ny = " + y);
		
		//Passo 4:
		z = (byte) x;
		
		//Passo 5:
		System.out.print("\nz = " + z);
	

	}

}
Non riesco a capire perchè
1) Se inserisco, per esempio il valore: 12.345 la console visualizza questo:

Inserisci un numero reale: 12.345
x = 12345.0
y = 12345
z = 57

2) Se inserisco solamente uno o due valori dopo la virgola (per esempio 12.3 o 12.34) il programma mi da il seguente errore:

Exception in thread "main" java.util.InputMismatchException
at java.util.Scanner.throwFor(Unknown Source)
at java.util.Scanner.next(Unknown Source)
at java.util.Scanner.nextDouble(Unknown Source)
at Esercizio2.main(Esercizio2.java:23)

Sapete aiutarmi?

13 Risposte

  • Re: Problema con programma di conversione di tipo (Java)

    Mario Rossi ha scritto:


    2) Se inserisco solamente uno o due valori dopo la virgola (per esempio 12.3 o 12.34) il programma mi da il seguente errore:

    Exception in thread "main" java.util.InputMismatchException
    Con Scanner il parsing dei valori decimali è "localizzato", cioè dipende da un Locale (per default quello predefinito). Se hai il sistema in italiano, allora per default accetta la virgola (12,34)

    Se ti basta così, l'utente che digita deve essere consapevole di questo. Se vuoi fissare il Locale in Scanner, c'è il suo useLocale(Locale locale)
  • Re: Problema con programma di conversione di tipo (Java)

    andbin ha scritto:


    Mario Rossi ha scritto:


    2) Se inserisco solamente uno o due valori dopo la virgola (per esempio 12.3 o 12.34) il programma mi da il seguente errore:

    Exception in thread "main" java.util.InputMismatchException
    Con Scanner il parsing dei valori decimali è "localizzato", cioè dipende da un Locale (per default quello predefinito). Se hai il sistema in italiano, allora per default accetta la virgola (12,34)

    Se ti basta così, l'utente che digita deve essere consapevole di questo. Se vuoi fissare il Locale in Scanner, c'è il suo useLocale(Locale locale)
    Mhhh... con la virgola crasha sempre :/
    con il seguente errore:

    Exception in thread "main" java.util.InputMismatchException
    at java.util.Scanner.throwFor(Unknown Source)
    at java.util.Scanner.next(Unknown Source)
    at java.util.Scanner.nextInt(Unknown Source)
    at java.util.Scanner.nextInt(Unknown Source)
    at Media.main(Media.java:18)
  • Re: Problema con programma di conversione di tipo (Java)

    Mario Rossi ha scritto:


    Mhhh... con la virgola crasha sempre :/
    Se il locale predefinito è l'italiano, non può essere che la virgola sia il problema! Verifica bene.
  • Re: Problema con programma di conversione di tipo (Java)

    andbin ha scritto:


    Mario Rossi ha scritto:


    Mhhh... con la virgola crasha sempre :/
    Se il locale predefinito è l'italiano, non può essere che la virgola sia il problema! Verifica bene.
    Sono un neofita e non ho capito come settare il locale ... però posso dirti che, se inserisco il carattere "," il programma mi crasha sempre, mentre con il "." da' solo quegli errori che ho riportato in precedenza...
  • Re: Problema con programma di conversione di tipo (Java)

    Mario Rossi ha scritto:


    Sono un neofita e non ho capito come settare il locale
    Scanner keyboard = ........
    
    keyboard.useLocale(Locale.ENGLISH);  // es. inglese
    Locale è da importare è il java.util.Locale

    Mario Rossi ha scritto:


    però posso dirti che, se inserisco il carattere "," il programma mi crasha sempre, mentre con il "." da' solo quegli errori che ho riportato in precedenza...
    Scusa ma sai almeno quale è la lingua predefinita del tuo sistema?? Se italiano, ci va la virgola, se fosse inglese/americano ci va il punto.
  • Re: Problema con programma di conversione di tipo (Java)

    andbin ha scritto:


    Mario Rossi ha scritto:


    Sono un neofita e non ho capito come settare il locale
    Scanner keyboard = ........
    
    keyboard.useLocale(Locale.ENGLISH);  // es. inglese
    Locale è da importare è il java.util.Locale

    Mario Rossi ha scritto:


    però posso dirti che, se inserisco il carattere "," il programma mi crasha sempre, mentre con il "." da' solo quegli errori che ho riportato in precedenza...
    Scusa ma sai almeno quale è la lingua predefinita del tuo sistema?? Se italiano, ci va la virgola, se fosse inglese/americano ci va il punto.
    Ok grazie, importando il Locale e mettendolo in Inglese non crasha più e sembra funzionare bene... comunque il mio sistema operativo è impostato in italiano, ma, come ti ho già detto, se ci metto la virgola mi da errore... bho...
    Comunque non c'è un modo per impostare il locale in inglese di default per tutti i programmi? O dovrò importarlo manualmente in tutti i programmi?
  • Re: Problema con programma di conversione di tipo (Java)

    Mario Rossi ha scritto:


    Ok grazie, importando il Locale e mettendolo in Inglese non crasha più e sembra funzionare bene... comunque il mio sistema operativo è impostato in italiano, ma, come ti ho già detto, se ci metto la virgola mi da errore... bho...
    Scusa, ma toglimi una curiosità. Questo sul tuo pc:
    import java.util.Locale;
    
    public class Info {
        public static void main(String[] args) {
            System.out.println(System.getProperty("java.runtime.name"));
            System.out.println(System.getProperty("java.runtime.version"));
            System.out.println(System.getProperty("java.vm.name"));
            System.out.println(System.getProperty("java.vm.vendor"));
            System.out.println(System.getProperty("os.name"));
            System.out.println(Locale.getDefault());
        }
    }
    cosa stampa??

    Mario Rossi ha scritto:


    Comunque non c'è un modo per impostare il locale in inglese di default per tutti i programmi? O dovrò importarlo manualmente in tutti i programmi?
    O cambi le impostazioni globali del sistema operativo sulla localizzazione .... o imposti il Locale (su un Scanner specifico o il Locale di default con Locale.setDefault(Locale locale) ) su ogni applicazione.
  • Re: Problema con programma di conversione di tipo (Java)

    andbin ha scritto:


    Mario Rossi ha scritto:


    Ok grazie, importando il Locale e mettendolo in Inglese non crasha più e sembra funzionare bene... comunque il mio sistema operativo è impostato in italiano, ma, come ti ho già detto, se ci metto la virgola mi da errore... bho...
    Scusa, ma toglimi una curiosità. Questo sul tuo pc:
    import java.util.Locale;
    
    public class Info {
        public static void main(String[] args) {
            System.out.println(System.getProperty("java.runtime.name"));
            System.out.println(System.getProperty("java.runtime.version"));
            System.out.println(System.getProperty("java.vm.name"));
            System.out.println(System.getProperty("java.vm.vendor"));
            System.out.println(System.getProperty("os.name"));
            System.out.println(Locale.getDefault());
        }
    }
    cosa stampa??

    Mario Rossi ha scritto:


    Comunque non c'è un modo per impostare il locale in inglese di default per tutti i programmi? O dovrò importarlo manualmente in tutti i programmi?
    O cambi le impostazioni globali del sistema operativo sulla localizzazione .... o imposti il Locale (su un Scanner specifico o il Locale di default con Locale.setDefault(Locale locale) ) su ogni applicazione.
    Questo:

    Java(TM) SE Runtime Environment
    1.8.0_171-b11
    Java HotSpot(TM) 64-Bit Server VM
    Oracle Corporation
    Windows 10
    it_IT
  • Re: Problema con programma di conversione di tipo (Java)

    Mario Rossi ha scritto:


    Java(TM) SE Runtime Environment
    1.8.0_171-b11
    Java HotSpot(TM) 64-Bit Server VM
    Oracle Corporation
    Windows 10
    it_IT
    E' un runtime "moderno" Java 8 della Oracle. E il Locale di default del sistema è l'italiano ..... quindi mi sfugge il perché la virgola non possa essere considerata correttamente in un numero decimale con Scanner che usa l'italiano ...
  • Re: Problema con programma di conversione di tipo (Java)

    andbin ha scritto:


    Mario Rossi ha scritto:


    Java(TM) SE Runtime Environment
    1.8.0_171-b11
    Java HotSpot(TM) 64-Bit Server VM
    Oracle Corporation
    Windows 10
    it_IT
    E' un runtime "moderno" Java 8 della Oracle. E il Locale di default del sistema è l'italiano ..... quindi mi sfugge il perché la virgola non possa essere considerata correttamente in un numero decimale con Scanner che usa l'italiano ...
    Non so'... se un giorno dovessi scoprirlo ti aggiorno
  • Re: Problema con programma di conversione di tipo (Java)

    Mario Rossi ha scritto:


    Non so'... se un giorno dovessi scoprirlo ti aggiorno
    Toglimi un'ultimissima curiosità, questo:
    public class ProvaNum {
        public static void main(String[] args) {
            Scanner sc = new Scanner("12,345");   // presuppone Locale "italiano" di default
            double d = sc.nextDouble();
            System.out.println(d);    // dovrebbe stampare 12.345
        }
    }
    te lo stampa il numero? Se te lo stampa, con Locale "italiano" la virgola è OK (e non vedrei come potrebbe essere diversamente ..).
  • Re: Problema con programma di conversione di tipo (Java)

    andbin ha scritto:


    Mario Rossi ha scritto:


    Non so'... se un giorno dovessi scoprirlo ti aggiorno
    Toglimi un'ultimissima curiosità, questo:
    public class ProvaNum {
        public static void main(String[] args) {
            Scanner sc = new Scanner("12,345");   // presuppone Locale "italiano" di default
            double d = sc.nextDouble();
            System.out.println(d);    // dovrebbe stampare 12.345
        }
    }
    te lo stampa il numero? Se te lo stampa, con Locale "italiano" la virgola è OK (e non vedrei come potrebbe essere diversamente ..).
    Si, stampa 12.345.
    Mentre se cambio il tuo codice cosi':
    import java.util.Scanner;
    
    public class Modificabile {
        public static void main(String[] args) {
            Scanner sc = new Scanner("12.345");   //Ho sostituito la virgola con il punto
            double d = sc.nextDouble();
            System.out.println(d);    // dovrebbe stampare 12.345
        }
    }
    
    stampa 12345.0

    nel programma di cui parlavamo prima però, il punto o la virgola venivano messi alla console e la, se inserisco un numero con la virgola, mi da errore.
  • Re: Problema con programma di conversione di tipo (Java)

    Mario Rossi ha scritto:


    Si, stampa 12.345.
    Allora vuol dire che la virgola è il separatore dei decimali, perché il Locale è appunto quello italiano.
    Nota: println() con un double stampa SEMPRE la forma inglese.

    Mario Rossi ha scritto:


    Mentre se cambio il tuo codice cosi':
    stampa 12345.0
    Perché in italiano il "." (punto) è il separatore delle migliaia!!

    Mario Rossi ha scritto:


    se inserisco un numero con la virgola, mi da errore.
    Ma non può essere! Hai il locale Italiano e la virgola è il separatore dei decimali.
Devi accedere o registrarti per scrivere nel forum
13 risposte