2011-02-01 12 views
7

I utilizzando:come posso analizzare "30.0" o "30.00" in intero?

String str="300.0"; 
System.out.println(Integer.parseInt(str)); 

ritorno un'eccezione:

Exception in thread "main" java.lang.NumberFormatException: Per stringa di input: "300.0"

Come posso analizzare questa stringa su int?

grazie per l'aiuto :)

+0

Perché? I dati formattati come 30.0 o 30.00 chiaramente * non sono * un numero intero, è un numero reale. – EJP

risposta

12

Ecco come si fa:

String str = "300.0"; 
System.out.println((int) Double.parseDouble(str)); 

(ideone.com demo)

Il motivo hai un NumberFormatException è semplicemente che la stringa ("300.00", che è un numero in virgola mobile) non può essere analizzato come numero intero.


Può essere opportuno ricordare che questa soluzione stampe 300 anche per gli input "300.99". Per ottenere un arrotondamento corretta, si poteva fare

System.out.println(Math.round(Double.parseDouble("300.99"))); // prints 301 
+3

Ecco una versione senza casting: http://ideone.com/soMzL –

+0

Nice. Hai dimenticato questo metodo. – aioobe

2

Si dovrebbe analizzare a double prima e poi gettarlo ai int:

String str="300.0"; 
System.out.println((int)(Double.parseDouble(str))); 

avete bisogno di recuperare NumberFormatException s però.

Modifica: grazie a Joachim Sauer per la correzione.

+0

* Quasi corretto, dovrebbe analizzare a 'double' e quindi eseguire il cast di' int'. Un 'Double' non può essere lanciato su un' Integer'. –

+0

no non è necessario rilevare 'NumberFormatException' come 1)" 300.0 "verrà analizzato correttamente, 2) non è un'eccezione controllata. – aioobe

+0

@aioobe: ho assunto il presupposto che la stringa non sarebbe "300.0" per tutto il tempo e potrebbe potenzialmente contenere un valore non valido. – trojanfoe

2

È possibile utilizzare il metodo Double.parseDouble() per trasmetterlo per la prima volta a double e successivamente inoltrare double a int inserendo (int) di fronte ad esso. Si raggiunge quindi il seguente codice:

String str="300.0"; 
System.out.println((int)Double.parseDouble(str)); 
1

Integer.parseInt()deve di prendere una stringa che è un numero intero (cioè senza punti decimali, anche se il numero è equivalente ad un numero intero. L'eccezione che sei arrivare lì sta essenzialmente dicendo "mi hai detto che questo numero è un numero intero, ma questa stringa non è in un formato valido per un intero!"

Se il numero contiene un componente decimale, quindi è necessario utilizzare Double.parseDouble(), che restituirà una doppia primitiva. Tuttavia, poiché non ti interessa il componente decimale yo u può tranquillamente cadere semplicemente gettando il doppio per un int:

int num = (int)Double.parseDouble(str); 

nota, tuttavia, che questo sarà solo rilasciare il componente decimale, non arrotondare il numero fino a tutti. Quindi lanciare 1.2, 1.8 o 1.999999 su un intero ti darebbe tutto 1. Se vuoi arrotondare il numero che viene restituito, usa Math.round() invece di lanciare semplicemente un numero intero.

3

Sono stupito che nessuno abbia menzionato BigDecimal.

È davvero il modo migliore per convertire una stringa di decimale in int.
Josuha Bloch suggerisce di utilizzare questo metodo in uno dei suoi puzzle.

Ecco l'esempio eseguito su Ideone.com

class Test { 
    public static void main(String args[]) { 
    try { 
     java.math.BigDecimal v1 = new java.math.BigDecimal("30.0"); 
     java.math.BigDecimal v2 = new java.math.BigDecimal("30.00");    
     System.out.println("V1: " + v1.intValue() + " V2: " + v2.intValue()); 
    } catch(NumberFormatException npe) { 
     System.err.println("Wrong format on number"); 
    } 
    } 
} 
+1

Bene, quale pensi [si avvicini alla risposta corretta] (http://ideone.com/hzVi7)? – aioobe

+0

@aioobe: bella cattura. Forse era quello che il puzzle era tutto. L'ho appena ricordato dalla mia testa :-) –

+1

In realtà ho archiviato [un bug report] (http://bugs.sun.com/bugdatabase/view_bug.do?bug_id=7000825) relativo a questo stesso comportamento. Puoi votare per questo se sei d'accordo che è confuso;) – aioobe

Problemi correlati