增量生成唯一序列号

Generate unique serial number incrementally

我正在编写一个 vb.net 程序来生成我将用于打印条形码的三位数序列号。

要求是计数器必须计数:

001 - 999,A00 - A99,B00 - B99,...,Z00 - Z99

我不能使用字母 O 和 I

此代码只是将我传递给它的值增加 1。我首先检查该值是否 <=998,如果是 return 3 位数的值。我必须将它放在 Try 语句中,因为传递值 'A00' 会导致错误。

我一按 Z99,代码仍然是乱码。

问题:如果下一个序列号 = Z90 并且用户想要打印 35 个条形码,我需要在开始之前停止操作并警告用户只剩下 10 个可用序列号

此外,我也希望得到有关如何以更好的方式完成此任务的建议,将不胜感激任何建议

    Public Shared Function NextSerial(ByVal value As String) As String

    Try
        If value <= 998 Then
            value += 1
            Return ZeroPad(value, 3)
        End If

    Catch ex As Exception

    End Try
    Const chars As String = "ABCDEFGHJKLMNPQRSTUVWXYZ"
    Dim threenumber As String = ZeroPad(value, 3) 'ensure value is 3 digits.
    Dim alpha As String = threenumber.Substring(0, 1).ToUpper() ' 1st digit
    Dim beta As String = threenumber.Substring(1, 2) 'remaining two digits
    Dim newNumber As String
    Dim nextletter As String

    If beta = "99" Then
        beta = "00"
        nextletter = chars.Substring((chars.IndexOf(alpha, System.StringComparison.Ordinal) + 1), 1)
        newNumber = nextletter + beta
        Return newNumber

    Else
        beta += 1
        newNumber = alpha + ZeroPad(beta, 2)
        Return newNumber

    End If
End Function

Private Shared Function ZeroPad(ByVal number As String, ByVal toLength As Integer) As String
    ZeroPad = number

    'add the necessary leading zeroes to build it up to the desired length.
    Do Until Len(ZeroPad) >= toLength
        ZeroPad = "0" & ZeroPad
    Loop
End Function

我创建了代表每个数字位置中每个可用字符的常量字符串。然后我使用索引来查找当前序列号的位置并将一个数字向前移动以获得下一个序列号。这将始终提供下一个序列号,直到您 运行 数量不足。

注意:这段代码可以很容易地变得更紧凑,但我保留原样认为它可能更清晰。

Const charString1 As String = "0123456789ABCDEFGHJKLMNPQRSTUVWXYZ"
Const charString2 As String = "0123456789"
Const charString3 As String = "0123456789"

Public Function NextSerial(ByVal value As String) As String

    ' ensures the input is three chars long
    Dim threenumber As String = Right("000" & value, 3)

    Dim char1 As String = threenumber.Substring(0, 1)
    Dim char2 As String = threenumber.Substring(1, 1)
    Dim char3 As String = threenumber.Substring(2, 1)
    Dim char1Pos As Integer = charString1.IndexOf(char1)
    Dim char2Pos As Integer = charString2.IndexOf(char2)
    Dim char3Pos As Integer = charString3.IndexOf(char3)

    If char1Pos = -1 Or char2Pos = -1 Or char3Pos = -1 Then Throw New Exception("Invalid serial number format")

    ' move to next serial number
    char3Pos += 1

    If char3Pos > charString3.Length() - 1 Then
        char3Pos = 0
        char2Pos += 1
    End If
    If char2Pos > charString2.Length() - 1 Then
        char2Pos = 0
        char1Pos += 1
    End If
    If char1Pos > charString1.Length() - 1 Then Throw New Exception("Out of serial numbers!")

    Return charString1.Substring(char1Pos, 1) & charString2.Substring(char2Pos, 1) & charString3.Substring(char3Pos, 1)

End Function

我认为您可以通过假设您的第一个字符是 'hundreds' 并转换为数字并递增来做到这一点:

Private Function NextSerial(value As String) As String
    Const chars As String = "0123456789ABCDEFGHJKLMNPQRSTUVWXYZ"

    Dim numericValue As Integer = 100 * (chars.IndexOf(value.Substring(0, 1))) + Integer.Parse(value.Substring(1, 2))
    numericValue += 1

    Return chars.Substring(numericValue \ 100, 1) + (numericValue Mod 100).ToString.PadLeft(2, "0")
End Function

您当然应该在函数开始时执行一些错误检查,以确保将有效的序列号传递给函数。我还将此函数放入 class 并添加诸如 isValid、SerialsRemaining 之类的函数,也许还有一个函数来检索多个连续出版物的列表。

我建议你所有的检查和计算都使用整数,只转换为序列号显示。知道剩余多少序列号会容易得多。

您的序列号类似于整数,只是超过 100 的是字母而不是数字。

注意:添加错误检查非常重要,这是假设所有输入都有效。

Module Module1

    Sub Main()

        Console.WriteLine(SerialNumber.ConvertSerialNumberToInteger("D22"))
        Console.WriteLine(SerialNumber.ConvertIntegerToSerialNumber(322))
        Console.WriteLine(SerialNumber.GetAvailableSerialNumber("Z90"))

        For Each sn As String In SerialNumber.GetNextSerialNumber("X97", 5)
            Console.WriteLine(sn)
        Next

        Console.ReadLine()

    End Sub

End Module

Class SerialNumber

    Private Const _firstPart As String = "ABCDEFGHJKLMNPQRSTUVWXYZ"

    Public Shared Function ConvertSerialNumberToInteger(ByVal serialNumber As String) As Integer

        Return (_firstPart.IndexOf(serialNumber(0)) * 100) + Integer.Parse(serialNumber.Substring(1, 2))
    End Function

    Public Shared Function ConvertIntegerToSerialNumber(ByVal value As Integer) As String

        Return _firstPart(value \ 100) & (value Mod 100).ToString("00")
    End Function

    Public Shared Function GetAvailableSerialNumber(ByVal serialNumber As String)

        Dim currentPosition As Integer
        Dim lastPosition As Integer

        currentPosition = ConvertSerialNumberToInteger(serialNumber)
        lastPosition = ConvertSerialNumberToInteger("Z99")

        Return lastPosition - currentPosition
    End Function

    Public Shared Function GetNextSerialNumber(ByVal serialNumber As String, ByVal amount As Integer) As List(Of String)

        Dim newSerialNumbers As New List(Of String)
        Dim currentPosition As Integer

        currentPosition = ConvertSerialNumberToInteger(serialNumber)

        For i As Integer = 1 To amount
            newSerialNumbers.Add(ConvertIntegerToSerialNumber(currentPosition + i))
        Next

        Return newSerialNumbers
    End Function

End Class