Средство проверки формата даты Visual Basic не работает? - PullRequest
1 голос
/ 06 ноября 2019

Я пытаюсь создать программу, которая проверяет формат введенной даты в формате DDMMYYYY. Я попытался использовать коллекцию while циклов, чтобы сделать это, однако это, кажется, не работает, и я не могу понять, почему!

Вот мой код:

Console.WriteLine("Enter your date of birth (DDMMYYYY): ")
            Dim dob As String = Console.ReadLine
            While CInt(Mid(dob, 3, 2)) > 12 Or CInt(Mid(dob, 3, 2)) < 1
                Console.WriteLine("x-----x")
                Console.WriteLine("Format Incorrect!")
                Console.WriteLine("Enter your date of birth: ")
                dob = Console.ReadLine
            End While
            While CInt(Mid(dob, 3, 2)) = 4 Or 6 Or 9 Or 1 And CInt(Mid(dob, 1, 2)) > 30
                Console.WriteLine("x-----x")
                Console.WriteLine("Format Incorrect!")
                Console.WriteLine("Enter your date of birth: ")
                dob = Console.ReadLine
            End While
            While CInt(Mid(dob, 3, 2)) = 2 And CInt(Mid(dob, 1, 2)) > 29
                Console.WriteLine("x-----x")
                Console.WriteLine("Format Incorrect!")
                Console.WriteLine("Enter your date of birth: ")
                dob = Console.ReadLine
            End While
            While CInt(Mid(dob, 1, 2)) < 1
                Console.WriteLine("x-----x")
                Console.WriteLine("Format Incorrect!")
                Console.WriteLine("Enter your date of birth: ")
            End While
            Console.WriteLine("Thank You!")

Я исследовал другие методы, но не нашел решений, которые бы соответствовали тому, что я ищу.

Ответы [ 2 ]

2 голосов
/ 07 ноября 2019

Вы можете использовать DateTime.TryParseExact () . Пример:

Sub Main()
    Console.WriteLine("Enter your date of birth (DDMMYYYY): ")
    Dim d As Date
    Do
        Dim dob = Console.ReadLine
        If DateTime.TryParseExact(dob, "ddMMyyyy", CultureInfo.InvariantCulture, DateTimeStyles.None, d) Then
            Exit Do
        End If
        Console.WriteLine("Please try again, pay particular attention to the format, no spaces or other characters.")
    Loop
    'you now have a real date called d
    Debug.Print(d.ToString("MM/dd/yyyy"))
    Console.WriteLine("Thank You!")
    Console.ReadLine()
End Sub
1 голос
/ 06 ноября 2019

Во втором цикле while вы написали:

CInt(Mid(dob, 3, 2)) = 4 Or 6 Or 9 Or 1.

Этот синтаксис является неправильным, поскольку должен существовать оператор, который может принимать значение true или false между каждым логическим оператором (или / и т.д.), а не просто числом. Попробуйте это:

Dim month As Integer = CInt(Mid(dob, 3, 2))
While (month = 4 Or month = 6 Or month = 9 Or month = 11) And CInt(Mid(dob, 1, 2)) > 30

Надеюсь, из этого вы поймете, что я имею в виду. Обратите внимание, что я также поставил скобки вокруг всех операторов Or, чтобы они интерпретировались как (a или b или c или d) и e вместо (a или b или c). ) или (д и е) .

...