如何检查票号是不是使用函数格式化?
Posted
技术标签:
【中文标题】如何检查票号是不是使用函数格式化?【英文标题】:How do I check if ticket number is formatted using a function?如何检查票号是否使用函数格式化? 【发布时间】:2017-02-06 20:37:29 【问题描述】:我希望我的函数遵循一些约定来检查我的票号是否需要格式化。
如果不符合约定,那么我想对票号进行一些更改。
票号19K3072216需要格式化成这个19-K3-07-002216,因为不满足以下条件。 我的函数应该执行以下操作。
-
检查前 2 位的值是否为 0 - 9(数字)
检查第 3 位的值是否为 A 到 Z
检查第 4 位的值是否为 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
【问题讨论】:
您应该能够使用正则表达式来检查它是否已经匹配,否则这将是一个非常手动的过程,需要拆分输入、验证每个规则,然后连接最终的字符串。 你能给我举个例子来说明如何使用正则表达式吗? 您的年份值是介于 00-99 之间还是限制在过去 30 年之间? 如前所述,这将取决于一年中的更多细节,但这是一个与您的示例相匹配的简单示例19-K3-07-002216
:/^\d2-[A-Z]\d-\d2-\d6$
您可以使用Regex.Match()
查看是否输入通过。我不是正则表达式专家,所以它可能会更好,但这个有效
【参考方案1】:
这实际上取决于您的输入以及它与示例的不同之处。
例如,无效输入是否始终采用相同的格式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 = "\d2-[A-Z]\d-\d2-\d6"
Dim match As Match = Regex.Match(p1, pattern)
Return match.Success
End Function
很难产生一个完全可行的解决方案,因为作为局外人的输入有太多未知数。
【讨论】:
杰克感谢您的帮助。有效的输入是 19-K3-07-002216 但您似乎认为另一个输入是有效的。所以这是我需要检查以确保其他输入匹配或转换为这种格式。我怎么做?我想要做的是将 19K3072216 格式化为 19-K3-07-002216 或 19K307002216。目前两者都可以 我修改了您的解决方案,现在我得到了我想要的。感谢您的帮助以上是关于如何检查票号是不是使用函数格式化?的主要内容,如果未能解决你的问题,请参考以下文章
MFC,如何检查 CString 格式是不是与 IP 格式匹配
如何在 ReactJS 中检查文本输入是不是具有有效的电子邮件格式?