2位年份索引号~ 4位年份索引号,不带正则表达式



我正在尝试替换应用程序中一个丑陋的方法。目的是将2位数的年度法定索引号转换为4位数的年度法定索引号。
有没有办法在不使用正则表达式

的情况下做到这一点?

:

12345/15 =比;12345/2015

67831/12 =比;67831/2012

下面的方法是有效的,但是体积太大,对我来说似乎不是很防弹。

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;
}

有没有人知道一种不使用正则表达式的更优雅的方法?

您可以使用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. 解析两位数年份的工作方式如下:

将年份值转换为适当的世纪TwoDigitYearMax财产。例如,TwoDigitYearMax的值为2029,那么一个两位数的值30将被转换成1930,而一个两位数的值值29将被转换为2029。

还请注意ParseExactTryParseExact调用parseInfo.calendar.ToFourDigitYear(result.Year) underhood。

参见:将两位数的年份转换为四位数的年份。

  • 如果DateTime解析逻辑不能满足你,你可以自己编写简单的If语句

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

  • 可能没有一个超级干净的方法来做到这一点,这里有一种使用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
                }
    

    如果这是我的项目(或者显然如果我是在回答一个关于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);
        }
    

    你可以试一试:使用DateTime.ParseExact()并提供类似"mm/yy"或"dd/mm/yy"或类似格式,您可能会得到您所期望的。

    假设输入是"09/41",您应该期望是1941年9月。

    我想这应该有帮助。

    相关内容

    • 没有找到相关文章

    最新更新