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

Vb.net 格式化序列号类型的字符串,vb.net,format,string-formatting,Vb.net,Format,String Formatting,我希望格式化一个字符串,以显示为序列号,例如 abc12345d67890 到 如果是数字,我可以 DataGridView.Columns(2).DefaultCellStyle.Format = "0000-0000-0000-0000" MaskedTextBox1.Mask = ("0000-0000-0000-0000") 但是如果它是一个字符串,这就不起作用了。有人能帮我找个方向吗 信息以16个字符显示,以便于阅读和理解。某些值为2AFHY89,因此必须记录 它以多种不同的方式/

我希望格式化一个
字符串
,以显示为序列号,例如

abc12345d67890

如果是数字,我可以

DataGridView.Columns(2).DefaultCellStyle.Format = "0000-0000-0000-0000"
MaskedTextBox1.Mask = ("0000-0000-0000-0000")
但是如果它是一个
字符串
,这就不起作用了。有人能帮我找个方向吗

  • 信息以16个字符显示,以便于阅读和理解。某些值为2AFHY89,因此必须记录

  • 它以多种不同的方式/时间显示,例如标签、文本框、DataGridView、

  • 我不理解IFormatProvider、ICustomFormatter,因此如果该值没有[a-z],我可以使用上面的示例(“
    0000-0000-0000-0000
    ”)

  • 我希望使用一种格式,而不是改变存储的数据。两个示例都不是一种仅编辑存储数据的格式


  • 您可以用零填充序列号以获得完整的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”,即使是暂时在函数中也可以。如果它是某种填充,则在长度需要时将其添加到过程中(问题不清楚它是否确实是左填充)

    用法:

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

    00ab-c123-45d6-7890

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

    笔记
  • 对于任何类型的格式化程序来说,在padding函数中添加字符都有点奇怪。通常,格式化只控制字符串的显示方式。如果序列应该显示为16个字符,那么它可能应该有16个字符
  • 您可以轻松地添加新格式,例如略去破折号的原始格式的
    “R”

  • 这与问题无关,但GUID是否更适合您的需要?我不希望编辑该值,只希望更改其显示方式,但谢谢,我将这样做。是的,它将保留空白。我的想法是我会经常使用这个答案。存储的值仅为“abc12345d67890”‘一个字符串’,答案将以多种方式显示,例如textbox DataGrid。我编辑了这个问题,希望能让它更容易理解。谢谢你的帮助。DGV数据绑定了吗?您可能会看到是否可以使用CellFormatting事件根据需要显示它。在编辑中,
    2AFHY89
    会有9个前导零吗?是的,你能举个例子吗?现在是凌晨1:42,我会尝试后面的方法
    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))