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

时间:2015-01-29 02:44:18

标签: vb.net format string-formatting

我希望将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. 显示了几种不同的方式/时间,例如label,Textbox,DataGridView,

  3. 我不了解IFormatProvider,ICustomFormatter所以如果该值没有[az],我可以使用上面的例子(" 0000-0000-0000-0000")

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

2 个答案:

答案 0 :(得分:1)

您可以用零填充序列号以获得完整的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)

答案 1 :(得分:1)

如果你想" 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. 您可以轻松地为Raw添加新格式,例如"R"格式,其中省略了破折号。