【问题标题】:input string was not in a correct format [C#]输入字符串的格式不正确 [C#]
【发布时间】:2013-05-15 09:09:52
【问题描述】:

我有这个自动生成订单 ID 的应用程序。现在我希望它像这样9999-99-9999,前四个数字代表年份。现在,第二个是月份,最后一个是自动递增的。

我现在正在处理第二个月份,即月份。所以在我的代码中,我必须知道它是两位数还是一位数,以便我可以添加一个零。当我运行应用程序时,出现一个错误,提示 输入字符串的格式不正确。这是什么意思?我的代码有错误吗?

private void btnOk_Click(object sender, EventArgs e)
{
    string order_ID = DateTime.Now.Year.ToString();
    order_ID += "-";

    if (Convert.ToInt32(order_ID) < 10)
    {
        order_ID += "0";
    }

    order_ID += DateTime.Now.Month.ToString();

}

错误在Convert.ToInt32(order_ID)这一行。

【问题讨论】:

  • order_ID += "-";这行代码的目的是什么?我认为这是问题所在。
  • 为什么您希望字符串“2013-”可以解析为整数?为什么不直接使用DateTime.Now.ToString("yyyy-MM")
  • @JonSkeet 好的,谢谢你现在正在工作。
  • (请注意,您需要不变的文化 - 请不要从该评论中获取我的确切代码。)

标签: c# winforms typeconverter


【解决方案1】:

真的不清楚你想用这个实现什么 - 为什么你会期望解析的年份永远小于 10?除非您真的期待一些严重损坏的系统时钟,否则没有必要这样做。

但是你根本不需要分别转换年份和月份:

string orderId = DateTime.UtcNow.ToString("yyyy-MM",
                                          CultureInfo.InvariantCulture);

注意使用UtcNow 通常比使用系统本地时区更好 - 尽管如果您真的想要使用系统本地时区,您可以更改它。 p>

如果当前区域性的默认日历系统是非公历,使用CultureInfo.InvariantCulture 将避免它转换为不同的日历系统,并且还避免使用非不变的格式信息。 (在这种情况下后者不会成为问题,但很容易成为其他格式字符串的问题。)

当然,你需要添加自动增量部分,但那是另一回事。

【讨论】:

  • 谢谢先生,现在我已经意识到我的错误了。 :)
【解决方案2】:

该错误意味着您尝试从中解析整数的字符串实际上并不包含有效的整数。你可以改用Int.TryParse

【讨论】:

    【解决方案3】:

    问题是你使用的是破折号......

    order_ID += "-";
    

    ...然后您尝试将其转换为int

        if (Convert.ToInt32(order_ID) < 10)
    

    您不能将其设为整数。 TryParse() 方法可能会让您更幸运。

    因此,您需要稍微重新整理一下代码。

    在不同的时间添加 -,或者在转换为 int 时将其删除

        if (Convert.ToInt32(order_ID.Replace("-","") < 10)
    

    【讨论】:

      【解决方案4】:

      对于您的代码:

      private void btnOk_Click(object sender, EventArgs e)
      {
          string order_ID = DateTime.Now.Year.ToString();
      
          if (DateTime.Now.Month < 10)
          {
              order_ID += "0";
          }  
          order_ID += "-"; 
      
          order_ID += DateTime.Now.Month.ToString();
      
      }
      

      但 Mehran 的解决方案更简单、最优雅。

      【讨论】:

        【解决方案5】:

        似乎该程序未能将您的 order_ID 转换为整数,因为它包含 -

        你实际上不需要这样做,只需使用这个:

        string order_ID = DateTime.Now.ToString("yyyy-MM");
        

        【讨论】:

        • 这不是 编译器 做的。请注意,由于我在回答中谈到的原因,值得包括不变的文化。
        • 但是先生,我还有一个问题,我该如何做自动增量的事情?将其集成到 order_ID 字符串中?
        • 可能你可以有一个名为 count 的整数,并且每次都添加到 order_IDorder_ID += count.ToString();
        • 感谢@JonSkeet,我会记住这一点,我是 C# 和编程的新手,还有很多东西要学:)
        猜你喜欢
        • 2021-11-24
        • 2016-06-22
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多