2010-10-19 3 views
6

У меня сжатое строковое значение, которое я извлекаю из файла импорта. Мне нужно отформатировать это в номер посылки, который отформатирован следующим образом: ##-##-##-###-###. Поэтому строка «410151000640» должна стать «41-01-51-000-640». Я могу сделать это со следующим кодом:Строка формата с тире

String.Format("{0:##-##-##-###-###}", Convert.ToInt64("410151000640")); 

Однако строка может содержать не все числа; у него может быть буква или два, и, следовательно, преобразование в int не удастся. Есть ли способ сделать это на строке, чтобы каждый символ, независимо от того, является ли это числом или буквой, будет правильно вписываться в формат?

ответ

19
Regex.Replace("410151000640", @"^(.{2})(.{2})(.{2})(.{3})(.{3})$", "$1-$2-$3-$4-$5"); 

Или немного короче версия

Regex.Replace("410151000640", @"^(..)(..)(..)(...)(...)$", "$1-$2-$3-$4-$5"); 
+0

Работает как очарование! Я извлек это в метод обертки с некоторой проверкой и обработкой ошибок. Благодаря! – Kevin

+0

Я должен действительно правильно изучить Regex. Очень хорошее решение этой проблемы. –

+1

@ Øyvind Если это помогает, мне нравится использовать http://www.regular-expressions.info/tutorial.html для справки. Они также говорят о различных ароматах регулярных выражений, предоставляемых различными двигателями. –

3

Это должно работать в вашем случае:

string value = "410151000640"; 
for(int i = 2; i < value.Length; i+=3){ 
    value = value.Insert(i, "-"); 
} 

Теперь value содержит строку с тиром вставленным.

EDIT

Я только сейчас увидел, что у вас не было тире между каждым вторым номером на всем пути, чтобы это потребует небольшой настройки (и делает его немного более неуклюжим и я боюсь,)

string value = "410151000640"; 
for(int i = 2; i < value.Length-1; i+=3){ 
    if(value.Count(c => c == '-') >= 3) i++; 
    value = value.Insert(i, "-"); 
} 
8

Я бы подошел к этому, имея свой собственный метод форматирования, если вы знаете, что «Номер посылки» всегда соответствует определенному правилу.

public static string FormatParcelNumber(string input) 
{ 
    if(input.length != 12) 
    throw new FormatException("Invalid parcel number. Must be 12 characters"); 

    return String.Format("{0}-{1}-{2}-{3}-{4}", 
       input.Substring(0,2), 
       input.Substring(2,2), 
       input.Substring(4,2), 
       input.Substring(6,3), 
       input.Substring(9,3)); 
} 
0

Если я неправильно понял вас, вы ищете функцию, которая удаляет все буквы из строки, не так ли?

Я создал это на лету, может быть, вы можете преобразовать его в C#, если это то, что вы ищете:

Dim str As String = "410151000vb640" 
str = String.Format("{0:##-##-##-###-###}", Convert.ToInt64(MakeNumber(str))) 


Public Function MakeNumber(ByVal stringInt As String) As String 
    Dim sb As New System.Text.StringBuilder 
    For i As Int32 = 0 To stringInt.Length - 1 
     If Char.IsDigit(stringInt(i)) Then 
      sb.Append(stringInt(i)) 
     End If 
    Next 
    Return sb.ToString 
End Function 
+0

Нет, буквы также включены в номер посылки, например «410151000vb6» должны стать «41-01-51-000-vb6» – Kevin

1

Если его часть пользовательского интерфейса вы можете использовать MaskedTextProvider в System.ComponentModel

MaskedTextProvider prov = new MaskedTextProvider("aa-aa-aa-aaa-aaa"); 
    prov.Set("41x151000a40"); 
    string result = prov.ToDisplayString(); 
+0

Не должно ли «a» в вашей маске быть «&»? «a» - буквенно-цифровое, необязательное. Единственными символами, которые он примет, являются буквы ASCII a-z и A-Z. http://msdn.microsoft.com/en-us/library/system.windows.forms.maskedtextbox.mask.aspx –

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

  • Нет связанных вопросов^_^