没有正则表达式的2位数年份索引号到4位数年份索引号

时间:2015-05-21 16:40:12

标签: c# datetime

我正在尝试替换应用程序中的丑陋方法。目的是将2位数年份法律索引号转换为4位数年份法律索引号 有没有办法在不使用正则表达式的情况下执行此操作

所以:

  

12345/15 =>二千〇一十五分之一万二千三百四十五

     

67831/12 =>二千〇一十二分之六万七千八百三十一

     

以下方法有效,但体积庞大,对我来说似乎不太贴防。

public static string IndexNumber2YrTo4Yr(string inp)
{
    var regex = new Regex(@"\/\d{0,2}$");
    var match = regex.Match(inp);
    if (match.Success)
    {
        var twoDigitYear = inp.Substring(inp.Length - 2);
        try
        {
            var twoDigitInt = Convert.ToInt32(twoDigitYear);
            var fourDigitYear = System.Threading.Thread.CurrentThread.CurrentCulture
                                .Calendar.ToFourDigitYear(twoDigitInt).ToString();
            return inp.Replace(@"/" + twoDigitYear, @"/" + fourDigitYear);
        }
        catch { return inp; }
    }
    return inp;
}

如果不使用正则表达式,有没有人知道更优雅的方法来实现这一目标。

4 个答案:

答案 0 :(得分:3)

您可以使用string.Split

代码段:

const char delimiter = '/';
string[] split = inp.Split(delimiter);
int year = DateTime.ParseExact(split[1], "yy", CultureInfo.InvariantCulture).Year;
return split[0] + delimiter + year;

备注

  1. 解析两位数的年份如下:
  2.   

    使用。将年份值转换为适当的世纪   TwoDigitYearMax属性。例如,如果TwoDigitYearMax值为2029,   那么两位数的30将转换为1930而两位数   值29将转换为2029。

    另请注意,ParseExactTryParseExact会调用parseInfo.calendar.ToFourDigitYear(result.Year)发动机罩。

    另见: Convert a two digit year to a four digit year

    1. 如果DateTime解析逻辑不满足您,您可以自己编写简单的if语句。

    2. 代码段不包含验证。在这种情况下,我建议使用DateTime.TryParse,这样您就可以验证第二部分是否是一年。

答案 1 :(得分:1)

可能没有一种超级干净的方法,这是String.Split的一种方法,并手动确定世纪。

            var split = inp.Split('/');
            if(split.Length > 1)
            {
                 string yearString = split[1];
                 int yearInt = 0;
                 if(int.TryParse(yearString, out yearInt ))
                 {
                     if(yearInt > 50)
                        return split[0] + "19" + yearInt.ToString();
                     else
                        return split[0] + "20" + yearInt.ToString();

                 }
                 else
                 {
                     //handle error
                 }
            }
            else
            {
                //handle error
            }

答案 2 :(得分:1)

如果是我的项目(或者显然我是在回答SO的问题),我会从这样的事情开始:

显然,我对索引的实际格式做了一些假设。

    public static string IndexNumber2YrTo4Yr(string inp)
    {
        if (inp == null)
        {
            throw new ArgumentNullException("inp");
        }

        string[] parts;

        parts = inp.Split('/');

        if (
            parts.Length != 2 ||
            parts[0].Length != 5 ||
            parts[1].Length != 2
        )
        {
            throw new ArgumentException("Index number invalid", "inp");
        }

        int twoDigitYear = 0;

        try
        {
            twoDigitYear = Convert.ToInt32(parts[1]);
        }
        catch (Exception e)
        {
            throw new ArgumentException("Year invalid", "inp", e);
        }

        return string.Format("{0}/{1:0000}", parts[0], YearTwoDigitToFourDigit(twoDigitYear));
    }

    public static int YearTwoDigitToFourDigit(int twoDigitYear)
    {
        if (twoDigitYear < 0 || twoDigitYear > 99)
        {
            throw new ArgumentOutOfRangeException("twoDigitYear");
        }

        // Do we like these rules? Or should we define them.
        return CultureInfo.InvariantCulture.Calendar.ToFourDigitYear(twoDigitYear);
    }

答案 3 :(得分:0)

你可以尝试的是: 使用DateTime.ParseExact()并提供类似“mm / yy”或“dd / mm / yy”或类似格式的格式,您可能会得到您期望的结果。

假设输入是“09/41”,你应该期待1941年9月。

我想它应该会有所帮助。