Chuỗi đầu vào là không đúng định dạng


83

Tôi mới sử dụng C #, tôi có một số kiến ​​thức cơ bản về Java nhưng tôi không thể làm cho mã này chạy đúng cách.

Nó chỉ là một máy tính cơ bản, nhưng khi tôi chạy chương trình VS2008 cho tôi lỗi này:

Máy tính

Tôi đã làm gần như cùng một chương trình nhưng trong java bằng cách sử dụng JSwing và nó hoạt động hoàn hảo.

Đây là dạng của c #:

Hình thứ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 = "";
    }
}

Những gì có thể là vấn đề? Có cách nào để giải quyết nó không?

PS: Tôi cũng đã thử

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

và nó không hoạt động.

Câu trả lời:


111

Lỗi có nghĩa là chuỗi bạn đang cố gắng phân tích cú pháp một số nguyên không thực sự chứa một số nguyên hợp lệ.

Rất ít khả năng các hộp văn bản sẽ chứa một số nguyên hợp lệ ngay lập tức khi biểu mẫu được tạo - đó là nơi bạn đang nhận các giá trị số nguyên. Sẽ có ý nghĩa hơn nhiều nếu cập nhật abtrong các sự kiện nhấp vào nút (giống như cách bạn đang ở trong hàm tạo). Ngoài ra, hãy kiểm tra Int.TryParsephương pháp - nó dễ sử dụng hơn nhiều nếu chuỗi có thể không thực sự chứa một số nguyên - nó không đưa ra một ngoại lệ nên dễ dàng khôi phục hơn.


2
Thông báo lỗi này cũng có thể xảy ra khi cố gắng chuyển đổi đầu vào Convert.ToDouble từ người dùng có văn hóa khác nhau, vì vậy bạn có thể sử dụng Convert.ToDouble (String, IFormatProvider) thay vì chỉ Convert.ToDouble (String). Rất khó để gỡ lỗi, vì chương trình sẽ hoạt động trên hệ thống của bạn, nhưng sẽ gây ra lỗi cho một số người dùng của nó, đây là lý do tại sao tôi có một phương pháp để ghi lại lỗi trên máy chủ của mình và tôi đã tìm ra sự cố nhanh chóng.
vinsa

58

Tôi đã gặp phải ngoại lệ chính xác này, ngoại trừ nó không liên quan gì đến việc phân tích cú pháp đầu vào số. Vì vậy, đây không phải là câu trả lời cho câu hỏi của OP, nhưng tôi nghĩ việc chia sẻ kiến ​​thức là điều có thể chấp nhận được.

Tôi đã khai báo một chuỗi và đang định dạng nó để sử dụng với JQTree yêu cầu dấu ngoặc nhọn ({}). Bạn phải sử dụng dấu ngoặc nhọn gấp đôi để nó được chấp nhận là một chuỗi được định dạng đúng:

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

Hy vọng rằng điều này sẽ giúp những người khác tìm thấy câu hỏi này nhưng không phân tích dữ liệu số.


18

Nếu bạn không xác thực rõ ràng cho các số trong trường văn bản, thì tốt hơn hết là sử dụng

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

Bây giờ nếu kết quả là thành công thì bạn có thể tiến hành tính toán của mình.


11
Thường resultkhông cần khởi tạo.
yazanpro

12

Các vấn đề

Có một số trường hợp có thể xảy ra tại sao lỗi xảy ra:

  1. Bởi vì textBox1.Textchỉ chứa số, nhưng số quá lớn / quá nhỏ

  2. textBox1.Textchứa:

    • a) không phải số (ngoại trừ spaceở đầu / cuối, -ở đầu) và / hoặc
    • b) hàng nghìn dấu phân cách trong văn hóa áp dụng cho mã của bạn mà không chỉ định NumberStyles.AllowThousandshoặc bạn chỉ định NumberStyles.AllowThousandsnhưng đặt sai thousand separatorvăn hóa và / hoặc
    • c) dấu phân tách thập phân (không nên tồn tại trong intphân tích cú pháp)

KHÔNG ĐƯỢC Ví dụ:

Trường hợp 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

Trường hợp 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

Trường hợp 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

Trường hợp 2 c)

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

Có vẻ KHÔNG ĐƯỢC, nhưng thực ra là OK Ví dụ:

Trường hợp 2 a) OK

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

Trường hợp 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

Các giải pháp

Trong mọi trường hợp, vui lòng kiểm tra giá trị của textBox1.Textbằng trình gỡ lỗi Visual Studio của bạn và đảm bảo rằng nó có định dạng số hoàn toàn chấp nhận được cho intphạm vi. Một cái gì đó như thế này:

1234

Ngoài ra, bạn có thể xem xét

  1. sử dụng TryParsethay vì Parseđể đảm bảo rằng số không được phân tích cú pháp không gây ra sự cố ngoại lệ cho bạn.
  2. kiểm tra kết quả TryParsevà xử lý nó nếu khôngtrue

    int val;
    bool result = int.TryParse(textbox1.Text, out val);
    if (!result)
        return; //something has gone wrong
    //OK, continue using val
    

3

Bạn đã không đề cập nếu hộp văn bản của bạn có giá trị trong thời gian thiết kế hoặc bây giờ. Khi biểu mẫu khởi tạo, hộp văn bản có thể không có giá trị nếu bạn không đặt nó vào hộp văn bản khi thiết kế biểu mẫu. bạn có thể đặt giá trị int trong thiết kế biểu mẫu bằng cách đặt thuộc tính văn bản trong desgin và điều này sẽ hoạt động.


3

Trong trường hợp của tôi, tôi đã quên đặt dấu ngoặc nhọn kép để thoát. {{myobject}}


0

đó cũng là vấn đề của tôi .. trong trường hợp của tôi, tôi đã thay đổi số PERSIAN thành số LATIN và nó hoạt động. VÀ cũng cắt chuỗi của bạn trước khi chuyển đổi.

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

0

Tôi đã gặp sự cố tương tự mà tôi đã giải quyết bằng kỹ thuật sau:

Ngoại lệ được đưa ra ở dòng mã sau (xem văn bản được trang trí bằng ** bên dưới):

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

Sau một chút điều tra, tôi nhận ra rằng vấn đề là chuỗi được định dạng bao gồm một ký hiệu đô la ($) mà các phương thức Parse / TryParse không thể giải quyết (tức là - loại bỏ). Vì vậy, bằng cách sử dụng phương thức Remove (...) của đối tượng chuỗi, tôi đã thay đổi dòng thành:

number = Double.Parse(numberStr.Remove(0, 1)); // Remove the "$" from the number

Tại thời điểm đó, phương thức Phân tích cú pháp (...) hoạt động như mong đợi.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.