101

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

これは単なる基本的な電卓ですが、VS2008 プログラムを実行すると、次のエラーが表示されます。

電卓

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

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);

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

4

9 に答える 9

132

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

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

于 2011-11-30T05:24:26.020 に答える
66

数値入力の解析とは何の関係もないことを除いて、私はこの正確な例外に遭遇しました。したがって、これは 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"]);

これが、この質問を見つけたが数値データを解析していない他の人々に役立つことを願っています。

于 2014-10-23T16:01:44.813 に答える
21

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

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

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

于 2011-11-30T05:30:19.317 に答える
13

問題

エラーが発生する理由として考えられるケースがいくつかあります。

  1. textBox1.Text数字しか含まれていませんが、数字が大きすぎる/小さすぎるためです

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

    • a) 非数字 (space先頭/末尾、先頭を除く-) および/または
    • b)指定せずにコードに適用されたカルチャの千区切り記号、NumberStyles.AllowThousandsまたは指定しNumberStyles.AllowThousandsたがカルチャに間違ったものを入れたthousand separator、および/または
    • c) 小数点記号 (int解析には存在しないはずです)

良くない 例:

ケース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

ケース 2 a)

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

ケース 2 b)

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

ケース 2 c)

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

一見OKではないが、実際にはOK 例:

ケース 2 a) OK

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

ケース 2 b) 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
    
于 2016-04-19T08:21:10.087 に答える
3

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

于 2011-11-30T05:29:54.447 に答える
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());
于 2015-12-10T14:54:59.993 に答える