2011-11-30 80 views
45

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ấy mã này để chạy đúng.Chuỗi đầu vào không đúng định dạng

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

Calculator

tôi đã làm hầu hết các chương trình tương tự nhưng trong java sử dụng JSwing và nó làm việc một cách hoàn hảo.

Dưới đây là hình thức của C#:

Form

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 = ""; 
    } 
} 

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

PS: Tôi cũng đã cố gắng

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

và nó đã không làm việc.

Trả lời

69

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

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

3

Bạn chưa đề cập đến liệu hộp văn bản của bạn có giá trị trong thời gian thiết kế hay ngay bây giờ. Khi hình thức khởi tạo hộp văn bản có thể không hae giá trị nếu bạn đã không đặt nó trong hộp văn bản khi trong quá trình thiết kế 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.

13

Nếu bạn không xác nhận một cách rõ ràng cho số trong lĩnh vực văn bản, trong trường hợp bất kỳ của nó tốt hơn để 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 với các tính toán của bạn.

+7

Thông thường, 'kết quả 'không cần được khởi tạo. – yazanpro

36

Tôi đã gặp phải ngoại lệ chính xác này, ngoại trừ việc không có gì liên quan đến 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ĩ rằng nó có thể chấp nhận được để chia sẻ kiến ​​thức.

Tôi đã khai báo một chuỗi và định dạng chuỗi để sử dụng với JQTree yêu cầu dấu ngoặc nhọn ({}). Bạn phải sử dụng các dấu ngoặc nhọn gấp đôi để nó được chấp nhận như 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 đ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 cú pháp dữ liệu số.

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 trime 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()); 
4

vấn đề

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

  1. textBox1.Text chứa chỉ số, nhưng số lượng là too big/too small

  2. textBox1.Text chứa :

    • a) không số (trừ space vào đầu/kết thúc, - ở đầu) và/hoặc
    • b) ngàn dải phân cách trong văn hóa áp dụng cho mã của bạn mà không chỉ định NumberStyles.AllowThousands hoặc bạn chỉ định NumberStyles.AllowThousands nhưng đặt sai thousand separator trong văn hóa và/hoặc
    • c) phân cách thập phân (mà không nên tồn tại trong int phân tích cú pháp)

KHÔNG Ví dụ OK:

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 một)

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! 

Dường như KHÔNG OK, nhưng thực sự 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 

Solutions

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

1234 

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

  1. sử dụng TryParse thay vì Parse để đảm bảo rằng số lượng không phân tích cú pháp không gây vấn đề bạn là ngoại lệ.
  2. kiểm tra kết quả của TryParse và xử lý nó nếu không muốn nói true

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

Trong trường hợp của tôi, tôi quên đặt đôi cú đúp xoăn để trốn thoát. {{myobject}}

Các vấn đề liên quan