我正在尝试替换应用程序中的丑陋方法。目的是将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;
}
如果不使用正则表达式,有没有人知道更优雅的方法来实现这一目标。
答案 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;
使用。将年份值转换为适当的世纪 TwoDigitYearMax属性。例如,如果TwoDigitYearMax值为2029, 那么两位数的30将转换为1930而两位数 值29将转换为2029。
另请注意,ParseExact
和TryParseExact
会调用parseInfo.calendar.ToFourDigitYear(result.Year)
发动机罩。
另见: Convert a two digit year to a four digit year
如果DateTime解析逻辑不满足您,您可以自己编写简单的if语句。
代码段不包含验证。在这种情况下,我建议使用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月。
我想它应该会有所帮助。