确定字符串是日期还是数字

时间:2018-10-18 19:32:20

标签: c# .net number-formatting string-parsing date-parsing

我需要可靠地确定用户输入的字符串是日期还是数字。

考虑字符串1.1。此字符串成功解析为使用

的双精度型
double.TryParse(s, NumberStyles.Float | NumberStyles.AllowThousands, CultureInfo.CurrentCulture, out var result)

此字符串也成功使用解析为DateTime

 DateTime.TryParse(s, out var dResult)

我们需要将此字符串解释为英语中的double。

当您考虑其他文化时,更加复杂。

例如,在德语中,NumberGroupSeperator和DateSeperator都是点,而不是英语中的逗号和斜杠。因此,用德语,字符串1.1实际上应该解析为DateTime(即:当年的1月1日)。以编程方式知道这一点的唯一方法是验证NumberGroupSeperator和NumberGroupSizes(因为德语中的字符串1.1与英语中的1,1等效,我们知道不应将其解析为双精度或整数,因为NumberGroupSeperator(逗号)放在错误的位置)。

从阅读文档(and this super passive aggressive GitHub issue conversation)开始,.NET在解析时无法真正验证NumberGroupSeperator和NumberGroupSizes。

以前有没有人遇到过这个问题,您是如何解决的?

我写了一些代码来手动验证NumberGroupSeperator和NumberGroupSizes,但似乎应该有一个更好的方法。如果有人感兴趣,我可以分享此代码。

编辑

对于那些寻求有关业务问题的更多信息的人。我正在开发一个开放源代码项目,该项目允许用户通过c#API编辑Excel电子表格。考虑有人在单元格A1中输入字符串“ 1.1”,在单元格B1中输入字符串“ 1”,然后使用此开放源代码库尝试在另一个单元格中计算公式= A1 + B1。 该项目需要完全校验Microsoft Excel 。因此,如果我们所使用的语言/文化将“ 1.1”解释为日期,则此加法的结果应为2018年1月1日的OADate加1(即:43101 + 1 = 43102)。但是,如果我们使用的语言中“ 1.1”是数字1.1,那么此计算的结果应为1.1 + 1 = 2.1。

是的,在进行此计算时,我们确实知道用户的语言/文化,但是解决方案需要在所有文化中均有效。

1 个答案:

答案 0 :(得分:0)

如果您需要C#表现得像Excel,那么我相信您当前的方法(在自定义解析器中正式化您的逻辑要求和优先级规则)是正确的解决方案。 C#不是excel,并且没有内置要求或逻辑使其具有类似的行为。

我的两分钱:如果我正在编写用于处理Excel数据的C#API,而不是遵循 Excel的解析规则,则我将遵循C#的解析规则(或更严格地说,符合您的某些逻辑)并在适当的情况下应用),并且仅将 data 写入excel文件。这样可以避免尝试模拟不受控制的系统,并且不会损害最终工作簿的正确性。