问题描述
我有一个未格式化的字符串(例如:Sundy / 03-1 3-1949) 我需要将其转换为“ dd / MM / yyyy”。
我的计划是删除文本,空格,特殊字符并仅保留数字(例如:Sundy / 03-1 3-1949-> 03131949)
然后将数字转换为日期格式。(例如:Sundy / 03-1 3-1949-> 03131949 ---> 13/03/1949)
我使用的代码
private void button1_Click(object sender,EventArgs e)
{
String stringWithDate = textBox1.Text.ToString();
if (stringWithDate.ToString() != null && !stringWithDate.ToString().Equals(""))
{
DateTime dts;
String str = stringWithDate.ToString();
str = Regex.Replace(str,@"[^\d]","");
Console.WriteLine("String: " + stringWithDate.ToString() + "\n Removed Spaces: " + str);
if (DateTime.TryParseExact(str,"MMddyyyy",System.Globalization.CultureInfo.CurrentCulture,System.Globalization.DateTimeStyles.None,out dts))
{
String a = dts.ToString("MM/dd/yyyy");
stringWithDate = a;
Console.WriteLine("String: " + stringWithDate.ToString() + "\n Removed Spaces: " + str + "\n Date formatted: " + a + "\n");
label1.Text = (a);
}
}
}
输出未检测到所有类型。有办法传递一切吗?
解决方法
这将获得一些缺少的值,但要理解的一件事很重要,那就是在任何地方都没有计算机程序可以理解人类可能输入的任何日期格式。您需要在前端做得更好,引导人们输入合理,一致且最重要的明确值。
private void button1_Click(object sender,EventArgs e)
{
if (string.IsNullOrEmpty(textBox1.Text)) return;
//normalize
var str = textBox1.Text;
if (str.Contains(",")) str = str.Split(",")[1];
str = Regex.Replace(str.Replace("-","/"),@"[^\d/]","");
if (str.StartsWith("/")) str = str.Substring(1);
Console.WriteLine($"Original: {textBox1.Text}\nNormalized: {str}");
//parse
string[] formats = {"MM/dd/yyyy","MM/d/yyyy"};
DateTime parsed;
if (DateTime.TryParseExact(str,formats,CultureInfo.CurrentCulture,DateTimeStyles.None,out parsed))
{
var result = parsed.ToString("MM/dd/yyyy");
Console.WriteLine($"Original: {textBox1.Text}\nNormalized: {str}\nParsed: {result}");
label1.Text = result;
}
}
我将进一步更改它以提取一些较小的方法:
private string NormalizeDateInput(string input)
{
if (string.IsNullOrEmpty(input)) "";
if (input.Contains(",")) input = input.Split(",")[1];
input = Regex.Replace(input.Replace("-","");
if (input.StartsWith("/")) input = input.Substring(1);
return input;
}
public DateTime ParseMyDate(string input)
{
DateTime result = default(DateTime);
input = NormalizeMyDateInput(input);
if (string.IsNullOrEmpty(input)) return result;
DateTime.TryParseExact(input,out result);
return result;
}
private void button1_Click(object sender,EventArgs e)
{
DateTime dts = ParseMyDate(textBox1.Text);
if (dts != default(DateTime))
{
label1.Text = dts.ToString("MM/dd/yyyy");
}
}
这里的一个优点是您可以将修补程序限制为NormalizeDateInput()
方法。
string str;
DateTime dts;
str = Console.ReadLine();
StringBuilder sb = new StringBuilder();
foreach (char c in str)
{
if ((c >= '0' && c <= '9'))
{
sb.Append(c);
}
}
string str1 = sb.ToString();
if (DateTime.TryParseExact(str,"MMddyyyy",System.Globalization.CultureInfo.CurrentCulture,System.Globalization.DateTimeStyles.None,out dts))
{
String a = dts.ToString("MM/dd/yyyy");
Console.WriteLine(a);
}
I tried for "Sundy / 03 - 1 3 - 1949" it is giving me output 03/13/1947.Try to merger this logic with your code and let me know if it is working