3

我有一个长度可能在 1 到 8 个字符之间的字符串。我需要将它们转换为一天、一个月和一年。对于缺少的部分,我将使用当前的部分。

我现在拥有的代码有点大而丑陋,我想知道是否有人对如何做到这一点有更聪明的想法。

我当前的代码如下:

var day = DateTime.Now.Day;
var month = DateTime.Now.Month;
var year = DateTime.Now.Year;

switch (digits.Length)
{
    case 1:
    case 2:
        day = int.Parse(digits.Substring(0));
        break;

    case 3:
    case 4:
        day = int.Parse(digits.Substring(0, 2));
        month = int.Parse(digits.Substring(2));
        break;
    case 5:
    case 6:
    case 7:
    case 8:
        day = int.Parse(digits.Substring(0, 2));
        month = int.Parse(digits.Substring(2, 2));
        year = int.Parse(digits.Substring(4));
        break;
    default:
        break;
}

注意:我知道这没有考虑文化,但它不应该:)

我试着这样做:

day = int.Parse(digits.Substring(0, 2));
if(digits.Length > 2)
    month = int.Parse(digits.Substring(2, 2));
if(digits.Length > 4)
    year = int.Parse(digits.Substring(4, 4));

但是ArgumentOutOfRangeException如果字符串的长度是 1、3、5、6 或 7 位,它会抛出一个......所以效果不太好。如果只有 Substring 方法会尽可能多地使用字母,而不是在没有足够的字母来“填充”子字符串时失败......

可以使用正则表达式吗?

4

4 回答 4

7

查看TryParseExact方法。

DateTime date;
if (DateTime.TryParseExact(
    digits, 
    new[] { "dd", "ddMM", "ddMMyyyy" }, 
    CultureInfo.InvariantCulture, 
    DateTimeStyles.None, 
    out date))
{
    int day = date.Day;
    int month = date.Month;
    int year = date.Year;    
}
于 2010-01-06T15:01:13.000 回答
0

所以对于程序来说,前两个数字也将是一天而不是一个月,比如 38 天 = 3,月 = 8?对于 10 岁以下的人来说,这一天总是零领先?

于 2010-01-06T15:12:44.347 回答
0

正则表达式可能是一个很好的解决方案。在我的脑海中,这可能看起来像:

^([0-9]{1,2})([0-9]{1,2})?([0-9]{1,4})?

最多可提供 4 个组,索引如下: 0 - 整个字符串 1 - 前 2 个数字(如果只有 1 个数字,则为 1) 2 - 第二对数字(如果只有 3 个数字,则为 1) 3 - 最后一组1-4位数

于 2010-01-06T15:06:47.917 回答
0

如果你用一些空格填充数字字符串的右侧,你可以让你的第二个片段工作:

digits += " ";
day = int.Parse(digits.Substring(0, 2));
if(digits.Length > 2)
    month = int.Parse(digits.Substring(2, 2));
if(digits.Length > 4)
    year = int.Parse(digits.Substring(4, 4));
于 2010-01-06T15:00:50.303 回答