我已经在C#中使用了一个小型控制台应用程序来开始使用该语言。我的目标是向用户询问以下内容:
我已经完成了以下所有输入字段:
System.Console.Write("Name: ");
String name = System.Console.ReadLine();
最后,应用程序将数据保存到.txt文件,如果给定数据有效。我需要检查名称字段的长度是否在1-30之间,并且日期输入仅接受相应限制内的数字答案(例如:您只能给出' month'介于1之间的值-12 ..)
我试图搜索不同的验证方法,但我不知道如何将它们全部放在一起并制作一个干净的" Checker" - 适用于此应用程序。
这是验证我的名字和姓氏字段的内容,但我不认为你可以将日期字段放在同一个体检中吗?
public static Boolean Checker(String check)
{
if (check.Length <= 30 && check.Length > 0)
{
return true;
}
return false;
}
有什么建议吗?
答案 0 :(得分:1)
您无法在单个方法中合理地验证这些输入,而无需知道字符串代表什么。
首先,我建议您仅输入日期输入,而不是三个单独的值。将日期输入验证为单个值而不是三个单独的值要容易得多。 NET库提供了许多方法来通过一次调用来解析日期(DateTime.TryParse,DateTime.TryParseExact)。相反,有三个单独的输入,要求您复制逻辑以检查闰年,检查一个月的最后一天以及由本地化问题引起的日期的许多其他细微方面。
所以,我想你只是要求出生姓名,姓氏和出生日期,并将验证更改为
public static Boolean Checker(String check, bool isDate)
{
if(isDate)
{
DateTime dt;
// Here you could add your formatting locale as you find appropriate
return DateTime.TryParse(check, out dt);
}
else
return check.Length > 0 && check.Length <= 30;
}
这样你的输入就像这样
// Infinite loop until you get valid inputs or quit
for(;;)
{
System.Console.Write("Name: ('quit' to stop)");
String name = System.Console.ReadLine();
if(name == "quit") return;
if(!Checker(name, false))
{
// Input not valid, message and repeat
Console.WriteLine("Invalid name length");
continue;
}
System.Console.Write("Date of Birth: (quit to stop)");
String dob = System.Console.ReadLine();
if(dob == "quit") return;
if(!Checker(dob, true))
{
// Input not valid, message and repeat
Console.WriteLine("Invalid name length");
continue;
}
// if you reach this point the input is valid and you exit the loop
break;
}
答案 1 :(得分:0)
为了检查输入字符串是否为日期,您可以尝试将其解析为DateTime对象:
UK2Y$Date = as.Date(UK2Y$Date)
US2Y$Date = as.Date(US2Y$Date)
GBPUSD$Date = as.Date(GBPUSD$Date)
# create empty dataframe with correct dates
dates = data.frame(Date = seq(as.Date("2012-07-01"), as.Date("2012-07-20"), by = '1 day'))
US2Y = US2Y[-4,]
group = merge(dates, UK2Y, by = "Date", all = T)
group = merge(group, US2Y, by = "Date", all = T)
group = merge(group, GBPUSD, by = "Date", all = T)
print(group)
Date UK2Y US2Y GBPUSD
1 2012-07-01 NA NA NA
2 2012-07-02 NA NA NA
3 2012-07-03 NA NA NA
4 2012-07-04 NA NA NA
5 2012-07-05 NA NA NA
6 2012-07-06 NA NA NA
7 2012-07-07 NA NA NA
8 2012-07-08 NA NA NA
9 2012-07-09 0.9330 0.5210 1.552554
10 2012-07-10 0.9401 0.5235 1.551831
11 2012-07-11 0.9122 0.5003 1.550388
12 2012-07-12 0.8732 NA 1.542972
13 2012-07-13 NA NA NA
14 2012-07-14 NA NA NA
15 2012-07-15 NA NA NA
16 2012-07-16 NA NA NA
17 2012-07-17 NA NA NA
18 2012-07-18 NA NA NA
19 2012-07-19 NA NA NA
20 2012-07-20 NA NA NA
答案 2 :(得分:0)
如果输入有效,您应该有一个从输入创建User
- 对象的中心方法,以及检查每个输入类型的方法,如FirstName
或DayOfBirth
。例如:
public class User
{
public static User CreateUserFromText(string firstName,string surName,string yearBirth,string monthBirth,string dayBirth)
{
if (firstName == null || surName == null || yearBirth == null || monthBirth == null || dayBirth == null)
throw new ArgumentNullException(); // better tell what argument was null
User user = new User
{
FirstName = firstName.Trim(),
SurName = surName.Trim()
};
bool validInput = IsFirstNameValid(user.FirstName) && IsSurNameValid(user.SurName);
DateTime dob;
if (!validInput || !IsValidDayOfBirth(yearBirth, monthBirth, dayBirth, out dob))
return null;
user.DayOfBirth = dob;
return user;
}
public DateTime DayOfBirth { get; set; }
public string SurName { get; set; }
public string FirstName { get; set; }
private static bool IsFirstNameValid(string firstName)
{
return firstName?.Length >= 1 && firstName?.Length <= 30;
}
private static bool IsSurNameValid(string surName)
{
return surName?.Length >= 1 && surName?.Length <= 30;
}
private static bool IsValidDayOfBirth(string year, string month, string day, out DateTime dayOfBirth)
{
DateTime dob;
string dateStr = $"{year}-{month}-{day}";
bool validDayOfBirth = DateTime.TryParse(dateStr, out dob);
dayOfBirth = validDayOfBirth ? dob : DateTime.MinValue;
return validDayOfBirth;
}
}