2016-09-12 5 views
0

私のコードで文字列をint型の部分に解析して何が問題なのか分かりません。解析する前に、すべてが正しいように見えます。文字列をint型に解析できません

import java.io.IOException; 

public class TheWindow { 

    public static void main(String[] args) throws IOException{ 

     String s = "13.16"; 
     double d = Double.parseDouble(s); 
     System.out.println(d); 
     char[] ch = s.toCharArray(); 
     char[] ch2 = new char[s.length()]; 
     for(int i = 0; i < ch.length; i++){ 
      if(ch[i] == '.'){ 
       break; 
      }else{ 
       ch2[i] = ch[i]; 
      } 
     } 
     String s2 = new String(ch2); 
     System.out.println(s2); 
     try{ 
      s2.trim(); 
      int newI = Integer.parseInt(s2); 
      System.out.println(newI); 
     }catch(Exception e){ 
      System.out.println("Failed"); 
     } 
    } 
} 
+1

エラーメッセージが何と言っていますか?何がうまくいかなかったのか知りたければ、それを捨てるのではなく読むことをお勧めします。あなたの 'ch2'が最後にいくつかのヌル文字を持っていると思われますが、あなたはループを壊しますが、' ch2'を小さくしてはいけません。デバッガを使用してコードをステップ実行し、各行が何をしているのか、どこが間違っているのかを理解することができます。 –

答えて

0

コードで問題が発生するのは、 '。'文字に達しました。

長さが5のch2を作成したので、最後の3つの空白がNULLであることを意味します。文字列にString s2 = new String(ch2)という文字列を入れると、文字列の末尾に3文字の特殊文字が追加されます(文字配列ch2の空きスペースごとに1つ)。その後、この問題を解決するには

は2であることをch2配列の長さを設定するか、動的に長さを決定したい場合は、「' in theのString with s.indexOfのインデックスを行います(」。「)and then set the length of the array to one minus the index of '」。

これはあなたの質問に記載されているように問題を解決するはずです。

+0

非常に役に立ちました!ありがとうございました! –

3

あなたはどこにでもtrim()から返さStringを格納していません。あなたは、どちらかが行うことができます:

s2 = s2.trim(); 
int newI = Integer.parseInt(s2); 

または

int newI = Integer.parseInt(s2.trim()); 
0
s2 = s2.trim(); 

変更tryブロック内のコードのこの部分。

文字列をトリミングしていますが、空白がまだ残っていてもそれを参照する変数に代入していないため、このような文字列を解析すると例外がスローされます。

0

Javaオブジェクトは変更できません。つまり、Javaオブジェクトは変更できません。また、文字列はJavaのオブジェクトです。

お客様のラインs2.trim()は、トリミングされたバージョンを返しますが、s2は直接変更されません。ただし、どこにも格納していないので、次の行で解析すると、untrimmedのs2となります。何をしたい

はバックでトリミングされたバージョンを格納しますs2 = s2.trim()、である。

0

私が理解から、あなたは小数点以下を切り捨てしたいです。もしそうなら、小数点以下の桁数を見つけ、その文字列を部分文字列化して解析することができます。

注:まだ解析できない文字列については、いくつかのtry-catchで戻したいかもしれません。

private static int tryParseInt(String str) { 
    int decimalIndex = str.indexOf("."); 

    if (decimalIndex != -1) { 
     return Integer.parseInt(str.substring(0, decimalIndex)); 
    } else { 
     return Integer.parseInt(str); 
    } 
} 

public static void main(String[] args) { 
    System.out.println(tryParseInt("13.16")); // 13 
} 
0

ch2配列に初期化されていない文字があります。トリムする前にスペースを設定するか、別の文字列コンストラクタを使用することができます。たとえば、次のように

 public static void main(String[] args) { 

     String s = "13.16"; 
     double d = Double.parseDouble(s); 
     System.out.println(d); 
     char[] ch = s.toCharArray(); 
     char[] ch2 = new char[s.length()]; 
     int i = 0; 
     for(i = 0; i < ch.length; i++){ 
      if(ch[i] == '.'){ 
       break; 
      }else{ 
       ch2[i] = ch[i]; 
      } 
     } 
     String s2 = new String(ch2, 0, i); 
     System.out.println(s2); 
     try{ 
      s2.trim(); 
      int newI = Integer.parseInt(s2); 
      System.out.println(newI); 
     }catch(Exception e){ 
      System.out.println("Failed"); 
     } 
    } 

}

関連する問題