私は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 = "";
}
}
何が問題になりますか?それを解決する方法はありますか?
シモンズ:私も試してみました
a = Convert.ToInt32(textBox1.text);
b = Convert.ToInt32(textBox2.text);
それはうまくいきませんでした。
エラーは、整数を解析しようとしている文字列が実際には有効な整数を含まないことを意味します。
フォームが作成されるとすぐにテキストボックスに有効な整数が含まれることはほとんどありません。つまり、整数値を取得する場所です。ボタンクリックイベントでa
とb
を更新するほうがはるかに理にかなっています(コンストラクタにいるのと同じ方法で)。また、 Int.TryParse
メソッドをチェックしてください。文字列に実際に整数が含まれていない場合は、はるかに使いやすくなります。例外が発生しないため、回復するのが簡単です。
私はこの正確な例外に出くわしましたが、数値入力の解析とは無関係でした。したがって、これは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"]);
うまくいけば、これはこの質問を見つけるが数値データを解析していない他の人々を助けるでしょう。
テキストフィールドの数字を明示的に検証していない場合は、いずれにせよ使用することをお勧めします。
int result=0;
if(int.TryParse(textBox1.Text,out result))
結果が成功の場合は、計算を続行できます。
問題
エラーが発生する理由はいくつか考えられます。
textBox1.Text
には数字しか含まれていませんが、その数字は 大きすぎる/小さすぎる です。
textBox1.Text
には以下が含まれているため。
space
、先頭の-
を除く)、および/またはNumberStyles.AllowThousands
を指定せずにコードに適用されたカルチャに千桁の区切り文字、またはNumberStyles.AllowThousands
を指定してもカルチャにthousand separator
を誤って入力している。int
の構文解析には存在してはいけません)NOT 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
ケース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例:
ケース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
解決策
すべての場合において、Visual Studioデバッガを使用してtextBox1.Text
の値を確認し、int
の範囲として純粋に許容される数値形式であることを確認してください。このようなもの:
1234
また、あなたが考えるかもしれません
TryParse
の代わりにParse
を使用します。TryParse
の結果を確認し、true
でなければそれを処理します
int val;
bool result = int.TryParse(textbox1.Text, out val);
if (!result)
return; //something has gone wrong
//OK, continue using val
あなたのテキストボックスがデザイン時または今のところ価値を持っているかどうかあなたは言及していません。フォームの初期化時にテキストボックスをテキストボックスに配置していないと、テキストボックスの値が正しくない場合があります。あなたはdesginのtextプロパティを設定することによってフォームデザインにint値を入れることができ、これはうまくいくはずです。
私の場合、私は逃げるために二重の中括弧を入れるのを忘れていました。 {{myobject}}
それも私の問題でした..私の場合、私はPERSIAN番号をLATIN番号に変更しました。また、変換前に文字列を削除します。
PersianCalendar pc = new PersianCalendar();
char[] seperator ={'/'};
string[] date = txtSaleDate.Text.Split(seperator);
int a = Convert.ToInt32(Persia.Number.ConvertToLatin(date[0]).Trim());
私は次のテクニックで解決したのと同じ問題を抱えていました:
次のコード行で例外がスローされました(下記の**で装飾されたテキストを参照)。
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(...)メソッドは予想どおりに機能していました。