入力文字列は、正しい形式ではありませんでした


83

私はC#を初めて使用し、Javaの基本的な知識はありますが、このコードを正しく実行できません。

これは単なる基本的な計算機ですが、プログラムを実行すると、VS2008で次のエラーが発生します。

電卓

私はほぼ同じプログラムを実行しましたが、JavaではJSwingを使用しており、完全に機能しました。

これがc#の形式です:

形

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;

namespace calculadorac
{
    public partial class Form1 : Form
    {

    int a, b, c;
    String resultado;

    public Form1()
    {
        InitializeComponent();
        a = Int32.Parse(textBox1.Text);
        b = Int32.Parse(textBox2.Text);
    }

    private void button1_Click(object sender, EventArgs e)
    {
        add();
        result();
    }

    private void button2_Click(object sender, EventArgs e)
    {
        substract();
        result();
    }

    private void button3_Click(object sender, EventArgs e)
    {
        clear();
    }

    private void add()
    {
        c = a + b;
        resultado = Convert.ToString(c);
    }

    private void substract()
    {
        c = a - b;
        resultado = Convert.ToString(c);
    }

    private void result()
    {
        label1.Text = resultado;
    }

    private void clear()
    {
        label1.Text = "";
        textBox1.Text = "";
        textBox2.Text = "";
    }
}

何が問題になる可能性がありますか?それを解決する方法はありますか?

PS:私も試しました

a = Convert.ToInt32(textBox1.text);
b = Convert.ToInt32(textBox2.text);

そしてそれはうまくいきませんでした。

回答:


111

このエラーは、整数を解析しようとしている文字列に実際には有効な整数が含まれていないことを意味します。

フォームが作成された直後にテキストボックスに有効な整数が含まれる可能性はほとんどありません。ここで整数値を取得します。これは、更新するために、はるかに理にかなってab(あなたがコンストラクタであるのと同じように)ボタンのクリックイベントに。また、Int.TryParseメソッドを確認してください(文字列に実際に整数が含まれていない場合は、はるかに使いやすくなっています)。例外はスローされないため、回復が簡単です。


2
このエラーメッセージは、異なる文化情報を持つユーザーからのConvert.ToDouble入力を試行した場合にもスローされる可能性があるため、Convert.ToDouble(String)だけでなくConvert.ToDouble(String、IFormatProvider)を使用できます。プログラムはシステム上で動作するため、デバッグは困難ですが、一部のユーザーにはエラーがスローされます。そのため、サーバーにエラーを記録する方法があり、問題をすばやく見つけました。
vinsa 2018

58

数値入力の解析とは何の関係もないことを除いて、私はこの正確な例外に遭遇しました。したがって、これはOPの質問に対する答えではありませんが、知識を共有することは許容できると思います。

文字列を宣言し、中括弧({})を必要とするJQTreeで使用するためにフォーマットしていました。適切にフォーマットされた文字列として受け入れられるようにするには、二重中括弧を使用する必要があります。

string measurements = string.empty;
measurements += string.Format(@"
    {{label: 'Measurement Name: {0}',
        children: [
            {{label: 'Measured Value: {1}'}},
            {{label: 'Min: {2}'}},
            {{label: 'Max: {3}'}},
            {{label: 'Measured String: {4}'}},
            {{label: 'Expected String: {5}'}},
        ]
    }},",
    drv["MeasurementName"] == null ? "NULL" : drv["MeasurementName"],
    drv["MeasuredValue"] == null ? "NULL" : drv["MeasuredValue"],
    drv["Min"] == null ? "NULL" : drv["Min"],
    drv["Max"] == null ? "NULL" : drv["Max"],
    drv["MeasuredString"] == null ? "NULL" : drv["MeasuredString"],
    drv["ExpectedString"] == null ? "NULL" : drv["ExpectedString"]);

うまくいけば、これはこの質問を見つけたが数値データを解析していない他の人々を助けるでしょう。


18

テキストフィールドの数値を明示的に検証していない場合は、いずれの場合も使用することをお勧めします

int result=0;
if(int.TryParse(textBox1.Text,out result))

結果が成功した場合は、計算を続行できます。


11
通常result、初期化する必要はありません。
yazanpro 2015

12

問題

エラーが発生する理由はいくつか考えられます。

  1. そのためtextBox1.Textだけ番号が含まれていますが、数が小さすぎる/大きすぎます

  2. textBox1.Text含まれているため:

    • a)非数字(space最初/最後、最初を除く-)および/または
    • b)コードに適用されたカルチャに、指定せずに、NumberStyles.AllowThousandsまたは指定したNumberStyles.AllowThousandsthousand separatorカルチャに間違ったものを入れた千個のセパレータ
    • c)小数点記号(int解析では存在しないはずです)

OKではない例:

ケース1

a = Int32.Parse("5000000000"); //5 billions, too large
b = Int32.Parse("-5000000000"); //-5 billions, too small
//The limit for int (32-bit integer) is only from -2,147,483,648 to 2,147,483,647

ケース2a)

a = Int32.Parse("a189"); //having a 
a = Int32.Parse("1-89"); //having - but not in the beginning
a = Int32.Parse("18 9"); //having space, but not in the beginning or end

ケース2b)

NumberStyles styles = NumberStyles.AllowThousands;
a = Int32.Parse("1,189"); //not OK, no NumberStyles.AllowThousands
b = Int32.Parse("1,189", styles, new CultureInfo("fr-FR")); //not OK, having NumberStyles.AllowThousands but the culture specified use different thousand separator

ケース2c)

NumberStyles styles = NumberStyles.AllowDecimalPoint;
a = Int32.Parse("1.189", styles); //wrong, int parse cannot parse decimal point at all!

一見OKではありませんが、実際にはOKです例:

ケース2a)OK

a = Int32.Parse("-189"); //having - but in the beginning
b = Int32.Parse(" 189 "); //having space, but in the beginning or end

ケース2b)OK

NumberStyles styles = NumberStyles.AllowThousands;
a = Int32.Parse("1,189", styles); //ok, having NumberStyles.AllowThousands in the correct culture
b = Int32.Parse("1 189", styles, new CultureInfo("fr-FR")); //ok, having NumberStyles.AllowThousands and correct thousand separator is used for "fr-FR" culture

ソリューション

いずれの場合も、textBox1.TextVisual Studioデバッガーでの値を確認し、int範囲に対して純粋に許容できる数値形式であることを確認してください。このようなもの:

1234

また、あなたは考えるかもしれません

  1. 使用してTryParseの代わりに、Parse非解析された数があなたの例外の問題が生じないことを保証します。
  2. 結果を確認し、TryParseそうでない場合は処理しますtrue

    int val;
    bool result = int.TryParse(textbox1.Text, out val);
    if (!result)
        return; //something has gone wrong
    //OK, continue using val
    

3

テキストボックスに設計時または現在の値があるかどうかについては言及していません。フォームの初期化時にテキストボックスを入力しないと、フォームのデザイン時にテキストボックスに値が表示されない場合があります。desginでtextプロパティを設定することにより、フォームデザインにint値を設定できます。これは機能するはずです。


3

私の場合、逃げるために二重の巻き毛の支柱を置くのを忘れました。{{myobject}}


0

それも私の問題でした..私の場合、PERSIAN番号をLATIN番号に変更して動作しました。また、変換する前に文字列をトリミングします。

PersianCalendar pc = new PersianCalendar();
char[] seperator ={'/'};
string[] date = txtSaleDate.Text.Split(seperator);
int a = Convert.ToInt32(Persia.Number.ConvertToLatin(date[0]).Trim());

0

次の手法で解決した同様の問題がありました。

例外は次のコード行でスローされました(以下の**で装飾されたテキストを参照)。

static void Main(string[] args)
    {

        double number = 0;
        string numberStr = string.Format("{0:C2}", 100);

        **number = Double.Parse(numberStr);**

        Console.WriteLine("The number is {0}", number);
    }

少し調べてみたところ、問題は、フォーマットされた文字列にドル記号($)が含まれていて、Parse / TryParseメソッドでは解決できない(つまり、削除する)ことであることがわかりました。したがって、文字列オブジェクトのRemove(...)メソッドを使用して、行を次のように変更しました。

number = Double.Parse(numberStr.Remove(0, 1)); // Remove the "$" from the number

その時点で、Parse(...)メソッドは期待どおりに機能しました。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.