Vb.net 如何使用函数检查票号的格式?

Vb.net 如何使用函数检查票号的格式?,vb.net,Vb.net,我希望我的函数遵循一些惯例来检查我的票号是否需要格式化 如果不符合约定,那么我想对票号做一些修改 票号19K3072216需要格式化为此19-K3-07-002216,因为它不符合以下条件。 我的函数应该执行以下操作 检查前两位数字的值是否为0-9(数字) 检查第三位数字的值是否为a到Z 检查第四位数字的值是否为0-9(数字) 检查第5位和第6位是否有日期值(例如,2位年份-17、90、15等) 检查接下来的6位数字,即第7-12位是否为数字 由于票号19K3072216不符合上述条件,我希望我

我希望我的函数遵循一些惯例来检查我的票号是否需要格式化

如果不符合约定,那么我想对票号做一些修改

票号19K3072216需要格式化为此19-K3-07-002216,因为它不符合以下条件。 我的函数应该执行以下操作

  • 检查前两位数字的值是否为0-9(数字)
  • 检查第三位数字的值是否为a到Z
  • 检查第四位数字的值是否为0-9(数字)
  • 检查第5位和第6位是否有日期值(例如,2位年份-17、90、15等)
  • 检查接下来的6位数字,即第7-12位是否为数字
  • 由于票号19K3072216不符合上述条件,我希望我的函数将其格式化为如下19-K3-07-002216

    字符串strTicketNumber应返回格式化的票号19-K3-07-002216

    我的vb.net函数

    Public Class Ticket_Code
    
        Public Shared Sub main()
            Dim strTicketNumber As String = FixTicketNumber("19K3072216")
    
        End Sub
    
        Public Shared Function FixCaseNumber(ByVal astrCaseNumber As String) As String
            Dim strCaseNumber As String = Replace(astrCaseNumber, "-", "")
    
            'Determine if ticket number is formatted
             How do I do this?
    
    
            'If ticket number is formatted add 2 zeros
             'How do I do this?
    
            'Else return unchanged
             'If ticket number is already formatted, just returned the number (original number)
    
            Return strCaseNumber
    
        End Function
    
    
    End Class
    

    这将真正取决于您的输入以及它与示例的不同程度。 例如,无效输入是否总是采用相同的格式
    19K3072216
    ,或者是否可能是所有数字、所有字母、长度小于/大于10个字符等。所有这些规则都需要考虑,并根据需要进行处理

    如果输入来自用户,请永远不要信任它,并始终假定它尽可能远离有效。如果应用程序可以处理这种情况,那么它就可以处理所有其他事情

    像这样的事情应该让你开始:

    Public Sub Main()
            Dim strTicketNumber As String = FixTicketNumber("19-K3-07-002216") ' or 19K3072216
            Console.WriteLine(strTicketNumber)
            Console.ReadKey()
        End Sub
    
    
        Private Function FixTicketNumber(p1 As String) As String
            Dim fixed As String = ''
            Dim valid As Boolean = checkTicketNumber(p1)
    
            If valid Then
                Return p1 ' Ticket number is valid, no transformation needed
            Else
                'Assume invalid input will always be 10 characters (e.g. 19K3072216)
                'Split the input and Step through each rule one at a time
                'returning the necessary result/format string as you go
    
                '#1 Check if the 1st 2 digits has a value 0 - 9 (numeric)
                Dim ruleOne As String = p1.Substring(0, 2)
                'perform isNumeric, concatenate to fixed if everything is ok
                'fixed += ruleOne+"-"
    
                '#2 Check if the 3rd digit has a value of A to Z
                Dim ruleTwo As String = p1.Substring(3, 1)
                'check if its a letter, concatenate to fixed if everything is ok
    
                '... same for all the rules
    
            End If
    
        End Function
    
        Private Function checkTicketNumber(p1 As String) As Boolean
            'See if the input matches the rules
            'Check if the 1st 2 digits has a value 0 - 9 (numeric)
            'Check if the 3rd digit has a value of A to Z
            'Check if the 4th digit has a value 0 - 9 (numeric)
            'Check if the 5th and 6th digits has a date value (e.g.2 digit year - 17, 90, 15 etc)
            'Check if the next 6 digits i.e. 7th - 12th digits are numeric.
            Dim pattern As String = "\d{2}-[A-Z]\d-\d{2}-\d{6}"
            Dim match As Match = Regex.Match(p1, pattern)
    
            Return match.Success
    
        End Function
    

    很难产生一个完全有效的解决方案,因为作为一个局外人,对输入有太多的未知因素。

    您应该能够使用正则表达式检查它是否已经匹配,否则这将是一个相当手工的过程,分割输入,验证每个规则,然后连接最后一个字符串。你能给我一个如何使用正则表达式的例子吗?你的年份值是在00-99之间还是在过去30年之间?如前所述,这将取决于一年中的一些细节,但这是一个与您的示例相匹配的简单示例
    19-K3-07-002216
    /^\d{2}-[a-Z]\d-\d{2}-\d{6}$
    您可以使用
    Regex.match()
    查看输入是否通过。我不是正则表达式专家,所以它可能会更好,但这一个工作杰克,谢谢你的帮助。有效输入是19-K3-07-002216,但您似乎认为其他输入是有效的。这就是我需要检查的,以确保其他输入匹配或转换为这种格式。我该怎么做?我要做的是将19K3072216格式化为19-K3-07-002216或19K307002216。现在两者都可以,我修改了你的解决方案,现在我得到了我想要的。谢谢你的帮助