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


83

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

작동하지 않았습니다.

답변:


111

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

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


2
이 오류 메시지는 다른 cultureinfo를 가진 사용자로부터 오는 Convert.ToDouble 입력을 시도 할 때도 발생할 수 있으므로 Convert.ToDouble (String) 대신 Convert.ToDouble (String, IFormatProvider)를 사용할 수 있습니다. 프로그램이 시스템에서 작동하지만 일부 사용자에게는 오류가 발생하기 때문에 디버그하기가 어렵습니다. 이것이 제가 서버에 오류를 기록하는 방법을 가지고 있고 문제를 빠르게 발견 한 이유입니다.
vinsa

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

이 질문을 찾았지만 수치 데이터를 구문 분석하지 않는 다른 사람들에게 도움이되기를 바랍니다.


19

텍스트 필드의 숫자에 대해 명시 적으로 유효성을 검사하지 않는 경우 어떤 경우에도 사용하는 것이 좋습니다.

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

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


11
일반적으로 result초기화 할 필요가 없습니다.
yazanpro

12

문제점

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

  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
    

3

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


3

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


0

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

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.