[c#] 입력 문자열의 형식이 잘못되었습니다

저는 C #을 처음 접했고 Java에 대한 기본 지식이 있지만이 코드를 제대로 실행할 수 없습니다.

기본 계산기 일 뿐이지 만 VS2008 프로그램을 실행하면이 오류가 발생합니다.

계산자

나는 거의 동일한 프로그램을 수행했지만 자바에서는 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 = "";
    }
}

무엇이 문제일까요? 그것을 해결할 방법이 있습니까?

추신 : 나는 또한 시도했다

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

작동하지 않았습니다.



답변

오류는 정수를 구문 분석하려는 문자열에 실제로 유효한 정수가 포함되어 있지 않음을 의미합니다.

양식이 생성 될 때 텍스트 상자에 유효한 정수가 포함되는 경우는 거의 없습니다. 여기서 정수 값을 가져옵니다. (생성자에있는 것과 같은 방식으로) 버튼 클릭 이벤트 를 업데이트 a하고 업데이트하는 것이 훨씬 더 합리적 b입니다. 또한 Int.TryParse메서드를 확인하십시오 . 문자열에 실제로 정수가 포함되어 있지 않으면 사용하기가 훨씬 쉽습니다. 예외를 throw하지 않으므로 복구하기가 더 쉽습니다.


답변

숫자 입력을 구문 분석하는 것과 관련이 없다는 점을 제외하고는이 정확한 예외가 발생했습니다. 따라서 이것은 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))

이제 결과가 성공하면 계산을 진행할 수 있습니다.


답변

문제점

오류가 발생하는 몇 가지 가능한 경우가 있습니다.

  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!

겉보기에는 좋지 않지만 실제로는 괜찮습니다.

사례 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
    


답변

텍스트 상자에 디자인 타임 또는 현재 값이 있는지 언급하지 않았습니다. 양식 초기화시 양식 디자인시 텍스트 상자에 입력하지 않으면 텍스트 상자에 값이 없을 수 있습니다. desgin에서 text 속성을 설정하여 양식 디자인에 int 값을 넣을 수 있으며 작동합니다.


답변

제 경우에는 탈출하기 위해 이중 중괄호를 넣는 것을 잊었습니다. {{myobject}}


답변

그것도 내 문제였습니다 .. 내 경우에는 페르시아어 번호를 라틴어 번호로 변경하고 작동했습니다. 그리고 변환하기 전에 문자열을 다듬습니다.

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