2015-07-02 4 views
-1

Я пытаюсь создать формат строки, который даст мне следующий вывод:Строка форматирования VB.NET

1-123-345-5671 
123-345-5671 

В принципе, если есть только 10 числа, то не включают 1-

Я знаю, что могу достичь этого, проверив длину строки, но мне было интересно, есть ли способ сделать это с форматированием строки, до сих пор я это сделал, но если есть 10 чисел, включая

String.Format("{0:#-000-000-0000}", CLng(myPhoneNumber)) 

Результатом является:

-123-345-5671 

Я знаю, что я могу применить другое форматирование в зависимости от длины myPhoneNumber, однако мне было интересно, если это возможно, чтобы добиться чего-то вроде этого, используя чисто String.Format (так не использовать, если условия не заменяются и т. д.)

+1

Вы можете форматировать строку форматирования. Трудно себе представить, что это улучшает код. Пример Borken кстати. –

+1

Как говорит Ханс, ваши примеры выходов и ваш пример кода не совпадают. Можете ли вы уточнить, хотите ли вы три или четыре цифры в самой правой группе? – beercohol

+0

Просто используйте соответствующий формат, основанный на количестве цифр в вашем номере – Shar1er80

ответ

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 
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)) 

Форматировщик клиент ищет (PhoneNumber) код пользовательского формата "PN", а затем форматирует аргумент в зависимости от его длины. Если код «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

Тем не менее, я дал себе миленький интро в том, как создать эти, что-то я никогда не делал раньше :)

Смежные вопросы