入力文字列は、正しい形式ではありませんでした
-
26-10-2019 - |
質問
私はC#を使用していますが、Javaには基本的な知識がありますが、このコードを適切に実行することはできません。
これは基本的な計算機ですが、プログラムを実行すると、このエラーが発生します。
私はほぼ同じプログラムを行いましたが、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);
そして、それはうまくいきませんでした。
解決
エラーは、整数から解析しようとしている文字列に実際に有効な整数が含まれていないことを意味します。
フォームが作成されると、テキストボックスにすぐに有効な整数が含まれる可能性は非常に低いです。これは、整数値を取得する場所です。更新する方がはるかに理にかなっています a
と b
ボタンで[イベント]をクリックします(コンストラクターにいるのと同じように)。また、をチェックしてください Int.TryParse
方法 - 文字列に実際に整数が含まれていない可能性がある場合は、使用がはるかに簡単です - 例外をスローしないため、回復しやすいです。
他のヒント
数値入力の解析とは何の関係もない場合を除き、この正確な例外に遭遇しました。したがって、これはOPの質問に対する答えではありませんが、知識を共有することは許容できると思います。
私は文字列を宣言し、で使用するためにそれをフォーマットしていました jqtree 巻き毛のブレース({})が必要です。適切にフォーマットされた文字列として受け入れられるには、2倍のカーリーブレースを使用する必要があります。
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
含まれる:- a)非番号(を除く
space
最初/最後に、-
最初は)および/または - b)指定せずにコードに適用された文化の1000のセパレーター
NumberStyles.AllowThousands
または指定しますNumberStyles.AllowThousands
しかし、間違っていますthousand separator
文化および/または - c)10進セパレーター(に存在しないはずです
int
解析)
- a)非番号(を除く
大丈夫ではありません:
ケース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!
一見大丈夫ではないように見えますが、実際には大丈夫です:
ケース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.Text
Visual Studioデバッガーを使用して、純粋に受け入れられない数値形式があることを確認してください 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
テキストボックスがデザイン時間または現在の値を持っているかどうかについては言及していません。フォームの初期化の場合、テキストボックスは、フォームデザイン中にテキストボックスに入れていない場合、値をhae値ではない場合があります。 Desginにテキストプロパティを設定することにより、Int Valueをフォームデザインに配置できます。これは機能するはずです。
私の場合、私は逃げるために二重の巻き毛のブレースを置くことを忘れていました。 {{myobject}}
同様の問題があり、次の手法で解決しました。
例外は、次のコード行でスローされました(下の**で装飾されたテキストを参照):
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メソッドが解決できない(つまり - ストリップオフ)というドル記号($)が含まれていることに気付きました。したがって、文字列オブジェクトの削除(...)メソッドを使用して、行を変更しました。
number = Double.Parse(numberStr.Remove(0, 1)); // Remove the "$" from the number
その時点で、解析(...)メソッドは予想どおりに機能しました。
それも私の問題でした。私の場合、私はペルシャ語の数をラテン語に変更し、うまくいきました。また、変換する前にひもを締めます。
PersianCalendar pc = new PersianCalendar();
char[] seperator ={'/'};
string[] date = txtSaleDate.Text.Split(seperator);
int a = Convert.ToInt32(Persia.Number.ConvertToLatin(date[0]).Trim());