2011-11-30 19 views
45

मैं सी # के साथ नया हूं, मेरे पास जावा में कुछ बुनियादी ज्ञान है लेकिन मुझे यह कोड ठीक से चलाने के लिए नहीं मिल रहा है।इनपुट स्ट्रिंग सही प्रारूप में नहीं थी

यह सिर्फ एक बुनियादी कैलकुलेटर है, लेकिन जब मैं चलाने के कार्यक्रम VS2008 मुझे इस त्रुटि देता है:

Calculator

मैं लगभग एक ही कार्यक्रम है, लेकिन जावा में JSwing का उपयोग कर किया था और यह पूरी तरह से काम किया।

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

क्या समस्या हो सकती है:

यहाँ ग # के रूप है? क्या इसे हल करने का कोई तरीका है?

पुनश्च: मैं भी

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

की कोशिश की और यह काम नहीं किया।

उत्तर

69

त्रुटि का अर्थ है कि जिस स्ट्रिंग को आप एक पूर्णांक को पार्स करने की कोशिश कर रहे हैं वह वास्तव में एक वैध पूर्णांक नहीं है।

यह बेहद असंभव है कि फॉर्म बॉक्स बनने पर टेक्स्ट बॉक्स में एक वैध पूर्णांक होगा - जहां आप पूर्णांक मान प्राप्त कर रहे हैं। बटन क्लिक ईवेंट (उसी तरह से आप कन्स्ट्रक्टर में हैं) में a और b अपडेट करने के लिए और अधिक समझदारी होगी। इसके अलावा, Int.TryParse विधि देखें - यदि स्ट्रिंग में वास्तव में पूर्णांक नहीं हो सकता है तो यह उपयोग करना बहुत आसान है - यह अपवाद नहीं फेंकता है, इसलिए इसे पुनर्प्राप्त करना आसान है।

3

आपने उल्लेख नहीं किया है कि आपके टेक्स्टबॉक्स में डिज़ाइन समय या अब मूल्य है या नहीं। फ़ॉर्म फॉर्म को प्रारंभ करते समय फॉर्म बॉक्स डिज़ाइन के दौरान टेक्स्टबॉक्स में नहीं डालते हैं, तो टेक्स्ट बॉक्स को प्रारंभ नहीं किया जा सकता है। आप desgin में टेक्स्ट प्रॉपर्टी सेट करके फॉर्म डिज़ाइन में int मान डाल सकते हैं और इसे काम करना चाहिए।

13

आप किसी भी मामले में पाठ क्षेत्र में संख्या के लिए स्पष्ट रूप से मान्य नहीं हैं, तो इसके बेहतर उपयोग करने के लिए

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

अब अगर परिणाम सफलता है तो आप अपने गणना के साथ आगे बढ़ सकते हैं।

+7

आमतौर पर 'परिणाम' को प्रारंभ करने की आवश्यकता नहीं है। – yazanpro

36

मैं इस सटीक अपवाद में भाग गया, सिवाय इसके कि संख्यात्मक इनपुट पार्सिंग के साथ इसका कोई लेना-देना नहीं था। तो यह ओपी के सवाल का जवाब नहीं है, लेकिन मुझे लगता है कि ज्ञान साझा करना स्वीकार्य है।

मैं एक स्ट्रिंग घोषित करता था और इसे 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"]); 

उम्मीद है कि यह अन्य लोगों ने इस सवाल को खोजने लेकिन संख्यात्मक डेटा पार्स करने नहीं कर रहे हैं मदद मिलेगी: आप दोगुनी घुंघराले ब्रेसिज़ के लिए यह उचित रूप से स्वरूपित स्ट्रिंग के रूप में स्वीकार करने के लिए उपयोग करने के लिए है।

0

यह मेरी समस्या भी थी .. मेरे मामले में मैंने व्यक्तिगत संख्या को लैटिन नंबर में बदल दिया और यह काम किया। और कनवर्ट करने से पहले अपनी स्ट्रिंग को ट्रिम करें।

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

समस्याएं

कुछ संभव मामलों क्यों त्रुटि होती हैं:

  1. क्योंकि textBox1.Text केवल संख्या में शामिल हैं, लेकिन संख्या too big/too small

  2. है क्योंकि textBox1.Text शामिल :

    • क) गैर-संख्या (शुरुआत/अंत में space, - शुरुआत में) और/या
    • ख) अपने कोड के लिए आवेदन किया संस्कृति में हजार विभाजक को छोड़कर NumberStyles.AllowThousands निर्दिष्ट करने या आप NumberStyles.AllowThousands निर्दिष्ट के बिना लेकिन संस्कृति और/या
    • ग) दशमलव विभाजक में गलत thousand separator डाल (जो 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 = 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 ख)

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 ग)

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

कदाचित ठीक नहीं है, लेकिन वास्तव में ठीक उदाहरण:

केस 2 क) ठीक

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

केस 2 ख) ठीक

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 का मूल्य की जाँच करें और सुनिश्चित करें कि यह int श्रृंखला के लिए विशुद्ध रूप से-स्वीकार्य संख्यात्मक प्रारूप है कि सुनिश्चित करें।कुछ इस तरह:

1234 

इसके अलावा, आप TryParseParse के बजाय का उपयोग कर यह सुनिश्चित करें कि गैर पार्स नंबर पर आप अपवाद समस्या का कारण नहीं है

  1. का विचार कर सकते हैं।
  2. जांच TryParse का नतीजा है और इसे संभाल नहीं करता है, तो true

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

मेरे मामले में मैं से बचने के लिए डबल घुंघराले ब्रेस डाल करने के लिए भूल गया था। {{myobject}}

संबंधित मुद्दे

 संबंधित मुद्दे