我正在尝试替换应用程序中一个丑陋的方法。目的是将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;
指出
- 解析两位数年份的工作方式如下:
将年份值转换为适当的世纪TwoDigitYearMax财产。例如,TwoDigitYearMax的值为2029,那么一个两位数的值30将被转换成1930,而一个两位数的值值29将被转换为2029。
还请注意ParseExact
和TryParseExact
调用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月。
我想这应该有帮助。