我正在尝试创建一个字符串格式,它会给我以下输出:
1-123-345-5671
123-345-5671
基本上,如果只有10个数字,则不包括1 -
我知道我可以通过检查字符串的长度来实现这一点,但我想知道是否有办法用字符串格式化,到目前为止我已经完成了这个,但如果有10个数字,那么破折号仍然包括在内
String.Format("{0:#-000-000-0000}", CLng(myPhoneNumber))
结果是:
-123-345-5671
我知道我可以根据myPhoneNumber的长度应用不同的格式,但是我想知道是否有可能使用纯粹的String.Format来实现这样的事情(所以不使用if条件也不替换等等。 。)
答案 0 :(得分:1)
我删除了之前的答案,因为它无法处理更新后问题的四位数分组。
但是,您可以按如下方式创建自定义FormatProvider:
Public Class PhoneNumberFormat : Implements IFormatProvider, ICustomFormatter
Public Function GetFormat(formatType As Type) As Object Implements IFormatProvider.GetFormat
If formatType Is GetType(ICustomFormatter) Then
Return Me
Else
Return Nothing
End If
End Function
Public Function Format(format1 As String, arg As Object, formatProvider As IFormatProvider) As String Implements ICustomFormatter.Format
Dim ufmt As String = format1.ToUpper()
Dim result As String = arg.ToString()
If ufmt <> "PN" Then Return result
If result.Length = 10 Then
Return String.Format("{0:000-000-0000}", arg)
Else
Return String.Format("{0:0-000-000-0000}", arg)
End If
End Function
End Class
像这样使用:
String.Format(New PhoneNumberFormat(), "{0:PN}", CLng(myPhoneNumber))
客户格式化程序查找“PN”(PhoneNumber)自定义格式代码,然后根据其长度格式化参数。如果没有提供“PN”代码,它只返回带有默认ToString()的参数。
请注意我在IFormatProvider文档中无耻地解除了这个问题:https://msdn.microsoft.com/en-us/library/system.iformatprovider(v=vs.110).aspx?cs-save-lang=1&cs-lang=vb#code-snippet-3
我仍然给自己一个很好的介绍如何创建这些,这是我以前从未做过的事情:)
答案 1 :(得分:0)
获取您的号码中的位数,并根据该位置使用正确的格式。
Module Module1
Sub Main()
Dim phoneNumber As Long = 1234567891
Dim numberOfDigits As Integer = Math.Log10(phoneNumber) + 1
Console.WriteLine(String.Format(If(numberOfDigits = 11, "{0:0-000-000-0000}", "{0:000-000-0000}"), phoneNumber))
Console.ReadLine()
End Sub
End Module
结果:
123-456-7891
如果phoneNumber为12345678911
结果:
1-234-567-8911