字符串格式化VB.NET

时间:2015-07-02 12:13:54

标签: vb.net string-formatting

我正在尝试创建一个字符串格式,它会给我以下输出:

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条件也不替换等等。 。)

2 个答案:

答案 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