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

输入字符串的格式不正确[C#],c#,winforms,typeconverter,C#,Winforms,Typeconverter,我有一个自动生成订单ID的应用程序。现在我希望它像这样9999-99-9999,前四个数字代表年份。现在,第二个是月份,最后一个是自动递增的 我现在正在做第二个,也就是本月。所以在我的代码中,我必须知道它是两位数还是一位数,这样我才能加上一个零。当我运行应用程序时,出现一个错误,显示输入字符串的格式不正确。这是什么意思?我的代码中有错误吗 private void btnOk_Click(object sender, EventArgs e) { string order_ID = Da

我有一个自动生成订单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();

}
private void btnOk_单击(对象发送者,事件参数e)
{
字符串order_ID=DateTime.Now.Year.ToString();
订单号+=“-”;
if(转换为32(订单ID)<10)
{
订单号+=“0”;
}
order_ID+=DateTime.Now.Month.ToString();
}

错误在这一行
Convert.ToInt32(order\u ID)

该错误意味着您试图从中解析整数的字符串实际上不包含有效的整数。您可以改为使用

似乎程序无法将您的
订单ID
转换为整数,因为它包含
-

实际上,您不需要这样做,只需使用以下命令:

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

问题是你用的是破折号

order_ID += "-";
…然后您试图将其转换为
int

    if (Convert.ToInt32(order_ID) < 10)
if(转换为32(订单ID)<10)
不能将其设为整数。使用TryParse()方法可能会更幸运

因此,您需要稍微重新混淆代码

在不同的时间添加-或在转换为int时删除它

    if (Convert.ToInt32(order_ID.Replace("-","") < 10)
if(转换为32(订单号替换(“-”,”)<10)

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

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

string orderId = DateTime.UtcNow.ToString("yyyy-MM",
                                          CultureInfo.InvariantCulture);
请注意,使用
UtcNow
通常比使用系统本地时区更好,不过如果您确实想使用系统本地时区,您可以更改这一点

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

当然,您需要添加自动递增部分,但这是另一回事。

对于您的代码:

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

}
private void btnOk_单击(对象发送者,事件参数e)
{
字符串order_ID=DateTime.Now.Year.ToString();
如果(DateTime.Now.Month<10)
{
订单号+=“0”;
}  
订单号+=“-”;
order_ID+=DateTime.Now.Month.ToString();
}

但是Mehran的解决方案更简单,也最优雅。

order_ID+=“-”这行代码的目的是什么?我认为这就是问题所在。为什么你希望字符串“2013-”可以作为一个整数进行解析?为什么不使用
DateTime。现在。ToString(“yyyy-MM”)
?@jonsket好的,谢谢你,它现在开始工作了。(请注意,您需要不变的区域性-请不要从该注释中获取我的确切代码。)不是编译器在做这件事。请注意,出于我在回答中提到的原因,包含不变区域性是值得的。但是,先生,我还有一个问题,我如何做自动递增的事情?将它集成到order\u ID字符串中?也许你可以有一个名为
count
的整数,每次添加到
order\u ID
order_ID+=count.ToString();
谢谢@JonSkeet,我会记住这一点,我对c#和编程非常陌生,有很多东西要学:)谢谢你,先生,现在我意识到我的错误了。:)