Вопрос
У меня есть сжатое строковое значение, я извлекаю из файла импорта. Мне нужно отформатировать это в номер посылки, который отформатирован следующим образом: ##-##-##-###-###
. Отказ Поэтому строка «410151000640» должна стать «41-01-51-000-640». Я могу сделать это со следующим кодом:
String.Format("{0:##-##-##-###-###}", Convert.ToInt64("410151000640"));
Однако строка не может быть всех чисел; Он может иметь письмо или два там, и, таким образом, преобразование в INT не удастся. Есть ли способ сделать это в строке, поэтому каждый символ, независимо от того, если это число или буква, впишется в формат правильно?
Решение
Regex.Replace("410151000640", @"^(.{2})(.{2})(.{2})(.{3})(.{3})$", "$1-$2-$3-$4-$5");
Или слегка короче версия
Regex.Replace("410151000640", @"^(..)(..)(..)(...)(...)$", "$1-$2-$3-$4-$5");
Другие советы
Я бы поддержал это, имея свой собственный способ форматирования, если вы знаете, что «номер посылки» всегда соответствует конкретному правилу.
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));
}
Это должно работать в вашем случае:
string value = "410151000640";
for( int i = 2; i < value.Length; i+=3){
value = value.Insert( i, "-");
}
Теперь value
Содержит строку с вставленными тиреми.
РЕДАКТИРОВАТЬ
Я только сейчас увидел, что у вас не было чертов между каждым вторым числом, до этого потребуется небольшой твик (и делает его немного более неуклюжем, а также боюсь)
string value = "410151000640";
for( int i = 2; i < value.Length-1; i+=3){
if( value.Count( c => c == '-') >= 3) i++;
value = value.Insert( i, "-");
}
Если его часть UI, вы можете использовать MaskedTextProvider
в System.ComponentModel
MaskedTextProvider prov = new MaskedTextProvider("aa-aa-aa-aaa-aaa");
prov.Set("41x151000a40");
string result = prov.ToDisplayString();
Если я понимаю вас правильно, вы ищете функцию, которая удаляет все буквы из строки, не так ли?
Я создал это на лету, может быть, вы можете преобразовать его в 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
Вот простой метод расширения с какой-то утилитой:
public static string WithMask(this string s, string mask)
{
var slen = Math.Min(s.Length, mask.Length);
var charArray = new char[mask.Length];
var sPos = s.Length - 1;
for (var i = mask.Length - 1; i >= 0 && sPos >= 0;)
if (mask[i] == '#') charArray[i--] = s[sPos--];
else
charArray[i] = mask[i--];
return new string(charArray);
}
Используйте это следующим образом:
var s = "276000017812008";
var mask = "###-##-##-##-###-###";
var dashedS = s.WithMask(mask);
Вы можете использовать его с любой строкой, и любой символ, отличный от # в маске, будет вставлен. Маска будет работать справа налево. Вы можете настроить его, чтобы пойти на другую сторону, если хотите.
Радоваться, веселиться.