格式化序列号类型的字符串

Formating String for a serial number type

我希望格式化 string 以显示为序列号,例如

abc12345d67890

00ab-c123-45d6-7890

如果是数字我可以

DataGridView.Columns(2).DefaultCellStyle.Format = "0000-0000-0000-0000"
MaskedTextBox1.Mask = ("0000-0000-0000-0000")

但如果它是 String,这将不起作用。谁能帮我指明方向?

  1. 信息以 16 个字符显示,以便于阅读和理解一些值是 2AFHY89,必须 如此记录

  2. 显示几个不同的ways/times例如标签、文本框、DataGridView,

  3. 我不明白 IFormatProvider、ICustomFormatter,所以如果值没有 [a-z] 我可以使用上面的例子(“0000-0000-0000-0000”)

  4. 我希望使用不改变存储数据的格式这两个示例都不是仅编辑存储数据的格式。

您可以用零填充序列号以获得完整的 16 个字符,然后将其拆分为 4 个字符部分,然后用“-”连接这些部分。

Dim serial As String = "abc12345d67890"
serial = serial.PadLeft(16, "0"c)
Dim parts(3) As String
parts(3) = serial.Substring(serial.Length - 3)
parts(2) = serial.Substring(serial.Length - 7, 4)
parts(1) = serial.Substring(serial.Length - 11, 4)
parts(0) = serial.Substring(0, serial.Length - 12)
Dim formattedSerial As String = String.Join("-", parts)

如果你想在前面加上“00”,即使临时在函数中也可以。如果它是某种填充,请在长度需要时将其添加到过程中(问题不清楚是否确实是左填充)。

Shared Function FormatSerial(fmt As String, ser As String) As String

    Dim serial As String
    'ToDo: pad L or R as desired, or 
    ' throw an exception when the length is not as expected.
    serial = ("000000000000000").Substring(0, 16 - ser.Length) & ser

    Select Case fmt.ToUpper
        Case "S"
            Return String.Format("{0}-{1}-{2}-{3}", serial.Substring(0, 4),
                      serial.Substring(4, 4), serial.Substring(8, 4),
                      serial.Substring(12, 4))
        Case Else
            Throw New FormatException(
                    String.Format("The '{0}' format specifier is not supported.", fmt))
    End Select


End Function

用法:

thatTextBox.Text = FormatSerial("S","abc12345d67890")
Console.WriteLine(FormatSerial("S", strSerial))

输出:

00ab-c123-45d6-7890

这类似于 IFormatProvider,但采用共享函数的形式。在其他情况下,实际的 IFormatProvider 可能会更好。

注释

  1. 对于任何类型的格式化程序来说,在填充函数中添加字符都有点奇怪。通常,格式化只控制字符串的显示方式。如果序列号应该显示为 16 个字符,它可能应该 16 个字符。
  2. 您可以轻松添加新格式,例如省略破折号的 "R" Raw 格式。