我希望将string
格式化为序列号,例如
abc12345d67890
到
00ab-c123-45d6-7890
如果是数字我可以
DataGridView.Columns(2).DefaultCellStyle.Format = "0000-0000-0000-0000"
MaskedTextBox1.Mask = ("0000-0000-0000-0000")
但如果是String
,这不起作用。任何人都可以帮助我朝这个方向发展吗?
信息以16个字符显示,便于阅读和理解,一些值为2AFHY89,必须记录
显示了几种不同的方式/时间,例如label,Textbox,DataGridView,
我不了解IFormatProvider,ICustomFormatter所以如果该值没有[az],我可以使用上面的例子(" 0000-0000-0000-0000
")
我希望使用格式不改变存储的数据这两个示例都不是仅编辑存储数据的格式。
答案 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
可能会更好。
"R"
格式,其中省略了破折号。