2011-02-01 4 views
7

私が使用して:"30.0"または "30.00"をどのように解析することができますか?

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

復帰例外:

例外をスレッド "メイン" java.lang.NumberFormatExceptionに:入力文字列の場合: "300.0"

どのようにすることができますこのStringをintに解析しますか?

助け:)

+0

なぜ上で実行する例ですか? 30.0または30.00の形式のデータは、*整数ではありません。実数です。 – EJP

答えて

12

:あなたは、次のコードを取得し、その文字列( "300.00"

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

ideone.com demo)は

あなたはNumberFormatExceptionがを得た理由は単純で、浮動小数点数)は整数として解析できませんでした。


なお、この溶液も入力"300.99"ため300を印刷することは、言及する価値があるかもしれません。適切な丸めを取得するには、あなたが

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

キャストのないバージョンです:http://ideone.com/soMzL –

+0

ニース。その方法を忘れてしまった。 – aioobe

2

ためのおかげであなたがdouble最初にそれを解析し、intにキャストする必要があります

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

あなたはしかしNumberFormatException秒をキャッチする必要があります。

編集:修正のためのJoachim Sauerに感謝します。

+0

*ほぼ正しいですが、彼は 'double'を解析してから' int'にキャストする必要があります。 'Double'は' Integer'にキャストできません。 –

+0

いいえ、あなたは 'NumberFormatException'をキャッチする必要はありません。1)" 300.0 "はちょうど良いことを解析します、2)チェックされた例外ではありません。 – aioobe

+0

@aioobe:私は文字列が常に "300.0"でなく、無効な値を含んでいる可能性があると仮定しました。 – trojanfoe

2

Double.parseDouble()メソッドを使用すると、最初にdoubleにキャストし、次にdoubleをintにキャストして、(int)をその前に置くことができます。ここではあなたがそれを行う方法です

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

Integer.parseInt()は数が整数と同等であっても、整数(すなわち無小数点、だ文字列を取るためにを持って行うことができます。あなたがしている例外「本数は整数ですが、この文字列は整数の有効な書式ではありません」と本質的に言っています。

数値に小数成分が含まれている場合は、 Double.parseDouble()を使用してください。これはdoubleプリミティブを返しますが、小数成分には関心がないのでuが安全だけでintにdoubleをキャストすることによって、それをドロップすることができます

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

注しかし、これは単に小数コンポーネントをドロップすること、それがすべてで数値を切り上げはありません。したがって、1.2、1.8、または1.999999をintにキャストするとすべて1になります。戻ってくる数値を丸めたい場合は、intにキャストするのではなく、Math.round()を使用します。

3

私は誰も言及していないと驚いていますBigDecimal

これは実際には10進数の文字列をintに変換する最も良い方法です。
Josuha Bloch氏は、この方法をパズルラーの1つに使用することを提案しています。ここで

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

あなたはどちらが正解に最も近いと思いますか?(http://ideone.com/hzVi7)? – aioobe

+0

@aioobe:いいキャッチ。多分パズルがすべてだったのかもしれません。私はちょうど私の頭からそれを思い出しました:-) –

+1

私は実際に[バグレポート](http://bugs.sun.com/bugdatabase/view_bug.do?bug_id=7000825)をこのような動作に関連して提出しました。あなたがそれが紛らわしいことに同意するなら、あなたはそれに投票することができます;) – aioobe