आदान सट्रींग सही स्वरूप में नहीं थी


83

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

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

कैलकुलेटर

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

यहाँ 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विधि की जाँच करें - यदि स्ट्रिंग में वास्तव में पूर्णांक नहीं हो सकता है, तो इसका उपयोग करना बहुत आसान है - यह एक अपवाद नहीं फेंकता है ताकि इससे उबरना आसान हो।


2
यह त्रुटि संदेश तब भी फेंका जा सकता है जब अलग-अलग कल्चरिनो के साथ उपयोगकर्ता से आने वाले Convert.ToDouble इनपुट की कोशिश करें, ताकि आप केवल Convert.ToDouble (स्ट्रिंग) के बजाय Convert.ToDouble (स्ट्रिंग, IFormatProvider) का उपयोग कर सकें। यह डिबग करना कठिन है, क्योंकि प्रोग्राम आपके सिस्टम पर काम करेगा, लेकिन इसके कुछ उपयोगकर्ताओं पर त्रुटि फेंक देगा, यही कारण है कि मेरे पास मेरे सर्वर पर त्रुटियों को लॉग करने की एक विधि है और मुझे समस्या के लिए तेजी से पता चला है।
vinsa

58

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

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

ठीक नहीं उदाहरण:

मामला एक

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

इसके अलावा, आप पर विचार कर सकते हैं

  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 में टेक्स्ट प्रॉपर्टी सेट करके फॉर्म डिजाइन में int value डाल सकते हैं और यह काम करना चाहिए।


3

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


0

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

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

थोड़ी जांच-पड़ताल के बाद, मुझे एहसास हुआ कि समस्या यह थी कि स्वरूपित स्ट्रिंग में एक डॉलर चिह्न ($) शामिल था जिसे पार्स / ट्रायपर्स तरीके हल नहीं कर सकते (यानी - स्ट्रिप ऑफ)। इसलिए स्ट्रिंग ऑब्जेक्ट के निकालें (...) विधि का उपयोग करके मैंने लाइन को निम्न में बदल दिया:

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

उस बिंदु पर पार्स (...) विधि ने उम्मीद के मुताबिक काम किया।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.