C# 输入字符串的格式不正确

C# 输入字符串的格式不正确,c#,exception,formatexception,C#,Exception,Formatexception,我是C#新手,我有一些Java的基本知识,但我无法让这段代码正常运行 这只是一个基本的计算器,但当我运行VS2008程序时,会出现以下错误: 我几乎做了同样的程序,但在java中使用了JSwing,它工作得非常好 这是c的形式: 有什么问题吗?有办法解决吗 PS:我也试过了 a = Convert.ToInt32(textBox1.text); b = Convert.ToInt32(textBox2.text); 该错误意味着您试图从中解析整数的字符串实际上不包含有效的整数 创建表单时,

我是C#新手,我有一些Java的基本知识,但我无法让这段代码正常运行

这只是一个基本的计算器,但当我运行VS2008程序时,会出现以下错误:

我几乎做了同样的程序,但在java中使用了JSwing,它工作得非常好

这是c的形式:

有什么问题吗?有办法解决吗

PS:我也试过了

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

该错误意味着您试图从中解析整数的字符串实际上不包含有效的整数


创建表单时,文本框不太可能立即包含一个有效的整数,这就是获取整数值的地方。更新按钮单击事件中的
a
b
更有意义(与您在构造函数中的方式相同)。另外,请检查该方法—如果字符串可能不包含整数,则更易于使用—它不会引发异常,因此更易于恢复。

您没有提到您的文本框是否在设计时或现在有值。表单初始化时,若在表单设计期间未将文本框放入文本框,则文本框可能没有值。您可以通过在desgin中设置text属性在表单设计中输入int值,这应该可以工作。

如果您没有在文本字段中明确验证数字,那么无论如何最好使用

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

现在,如果结果是成功的,那么您就可以继续计算了。

我遇到了这个异常,只是它与解析数字输入无关。所以这不是OP问题的答案,但我认为分享知识是可以接受的

我声明了一个字符串,并将其格式化,以便与需要大括号({})的字符串一起使用。您必须使用双大括号才能将其接受为格式正确的字符串:

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"]);
希望这能帮助其他发现这个问题但不解析数字数据的人。

这也是我的问题。。 在我的例子中,我把波斯语的数字改成拉丁语的数字,结果成功了。 并且在转换之前修剪你的字符串

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

问题

出现错误的原因可能有以下几种:

  • 因为
    textBox1.Text
    只包含数字,但数字是

  • 因为
    textBox1.Text
    包含:

    • a) 非数字(除了开头/结尾的空格,
      -
      )和/或
    • b) 在应用的区域性中为您的代码指定千个分隔符,但未指定
      numberstyle.AllowThousands
      ,或者您指定了
      numberstyle.AllowThousands
      ,但在区域性和/或
    • c) 小数分隔符(在
      int
      parsing中不应存在)

  • 不正常示例:

    案例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)

    案例2(b)

    案例2(c)


    看似不正常,但实际上正常示例:

    案例2 a)好的

    案例2 b)好的


    解决方案

    在所有情况下,请使用Visual Studio调试器检查
    textBox1.Text
    的值,并确保其具有适用于
    int
    范围的完全可接受的数字格式。大概是这样的:

    1234
    

    也可以考虑

  • 使用
    TryParse
    而不是
    Parse
    ,以确保未解析的数字不会导致异常问题
  • 检查
    TryParse
    的结果,如果不是
    true

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

  • 在我的情况下,我忘了把双卷括号逃跑。{{myobject}

    我有一个类似的问题,我用以下技术解决了这个问题:

    在以下代码行引发了异常(请参见下面用**修饰的文本):

    经过一点调查,我意识到问题在于格式化的字符串包含一个Parse/TryParse方法无法解析的美元符号($)。因此,使用string对象的Remove(…)方法,我将行更改为:

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

    此时,Parse(…)方法按预期工作。

    当使用括号语法无效的字符串格式化程序时,可能会遇到此异常

    // incorrect
    string.Format("str {incorrect}", "replacement")
    
    // correct
    string.Format("str {1}", "replacement")
    

    通常,
    result
    不需要初始化。当尝试从具有不同文化信息的用户提交Convert.ToDouble输入时,也会抛出此错误消息,因此您可以使用Convert.ToDouble(字符串, IFormatProvider),而不仅仅是Convert.ToDouble(字符串)。调试很难,因为程序可以在你的系统上运行,但会在一些用户身上抛出错误,这就是为什么我有一个方法在我的服务器上记录错误,我很快就发现了问题。这个家伙是世界上最好的
    a = Int32.Parse("-189"); //having - but in the beginning
    b = Int32.Parse(" 189 "); //having space, but in the beginning or end
    
    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
    
    1234
    
    int val;
    bool result = int.TryParse(textbox1.Text, out val);
    if (!result)
        return; //something has gone wrong
    //OK, continue using val
    
    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
    
    // incorrect
    string.Format("str {incorrect}", "replacement")
    
    // correct
    string.Format("str {1}", "replacement")