質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.50%
C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

Visual Studio

Microsoft Visual StudioはMicrosoftによる統合開発環境(IDE)です。多種多様なプログラミング言語に対応しています。

Q&A

解決済

2回答

10656閲覧

C# System.FormatException

shinichi0326

総合スコア47

C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

Visual Studio

Microsoft Visual StudioはMicrosoftによる統合開発環境(IDE)です。多種多様なプログラミング言語に対応しています。

0グッド

1クリップ

投稿2017/07/31 12:00

編集2017/08/01 09:56

###前提・実現したいこと
C#でSystem.FormatExceptionを解決したい

###発生している問題・エラーメッセージ

Unhandled Exception: System.FormatException: Input string was not in a correct format. at System.Number.StringToNumber (System.String str, NumberStyles options, System.NumberBuffer& number, System.Globalization.NumberFormatInfo info, Boolean parseDecimal)

###該当のソースコード

C#

1if(ipadress[0]==input_ipadress[0] && ipadress[1]==input_ipadress[1] && int.Parse(input_ipadress[2])>=int.Parse(range_ipadress_2[0]) && int.Parse(input_ipadress[2])<=int.Parse(range_ipadress_2[1]) && int.Parse(ipadress[3])>=0 && int.Parse(ipadress[3])<=255)

###試したこと
Visual Studio でデバッグしint.Parse(input_ipadress[2])>=int.Parse(range_ipadress_2[0]) の真偽値に何も入らないです。以下にスクリーンショットを載せます。

###補足情報(言語/FW/ツール等のバージョンなど)
より詳細な情報
イメージ説明
イメージ説明

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

s.t.

2017/07/31 12:45

input_ipadress[2]には何が入っているんですか?
shinichi0326

2017/07/31 18:37

上にスクリーンショットを追加しました。input_ipadress[2]には"99"が入っています。
shinichi0326

2017/08/01 02:46

skitoy4321さん、すいません。質問の仕方さえわかっていなかったみたいです。修正いたしましたので何かアドバイスありましたらお願いします。
shinichi0326

2017/08/01 08:55

同じプログラムをpython3で書いたところ正常に動作しました。データがおかしいのでしょうか?
MMashiro

2017/08/01 09:19

range_ipadress_2[0]には何が入ってますでしょうか?
shinichi0326

2017/08/01 09:54

文字列 "0" が入っています。質問の所に追加のスクリーンショットを張ります
guest

回答2

0

ベストアンサー

int.Parseは、前後あるいは途中に解釈不能な文字が入るとパースに失敗するので、それが原因ではないでしょうか。
以下、コード例です。int.Parseint.TryParseの違いはありますが、ロジックは同じだと思います。

int tmp; // false Console.WriteLine("{0}",int.TryParse("1-1", out tmp)); // true Console.WriteLine("{0}",int.TryParse("-1", out tmp)); // true Console.WriteLine("{0}",int.TryParse("1", out tmp)); // false Console.WriteLine("{0}",int.TryParse("11ab", out tmp)); // false Console.WriteLine("{0}",int.TryParse("a11", out tmp));

デバッグのコツとしては、

  • 現在一文に記述されている式を分解してみて、どこでエラーが発生するか確認する
  • エラーが発生した時に使われた値の内容を全て書く

とすれば、より正解に近づけるかもしれません。
例えば冗長になりますが、以下のように変形します。
変更前

csharp

1string x1, x2; 2if(int.Parse(x1) == int.Parse(x2))

変更後

csharp

1string x1, x2; 2// 処理 3int y1 = int.Parse(x1); 4int y2 = int.Parse(x2); 5if(y1 == y2)

エラーが発生したら、上記コードでいうとx1, x2の値を 全て 確認して、正しく文字列フォーマットになっているか確認します。

投稿2017/08/01 03:05

編集2017/08/02 00:15
skitoy4321

総合スコア229

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

shinichi0326

2017/08/02 04:43

sktioy4321さん、大変ありがとうございます。 1つずつ if 文を評価してみたところ int.Parse(ipadress[3])>=0 の判定部分に 本来は int.Parse(input_ipadress[3])>=0 としなければならなず ここを修正したところ上手く動きました。 私のケアレスミスです。 大変申し訳ございません。 的確なご指摘誠にありがとうございます。 以後気を付けます。 また何か解らないことがありましたら、ご教示いただければ幸いです。
guest

0

なにがしたいのかよくわからないけど
リクエスト元のIPAddressが特定の範囲かを確認したいってことですかね。

デバッグ済みなのであればinput_ipadressの配列の内容を全部確認できているのですよね。
何が入ってるのでしょうか。

対象のif文をtry-catchで囲って例外が起きたらcatchの中でそのinput_addressの内容をDebug.WriteLineするなりcatchの中にブレイクポイント張るなどしてみれば何が送られてきてるのか自ずとわかるのではないでしょうか。

投稿2017/07/31 13:21

Tak1016

総合スコア1408

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

shinichi0326

2017/07/31 18:40

一応、スクリーンショットを張っておきました。 C#は初心者なのでtry-catchは気付かなかったので、これから試してみます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.50%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問