Форматировать строку с тире - PullRequest
9 голосов
/ 19 октября 2010

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

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

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

Ответы [ 6 ]

24 голосов
/ 19 октября 2010
Regex.Replace("410151000640", @"^(.{2})(.{2})(.{2})(.{3})(.{3})$", "$1-$2-$3-$4-$5");

Или немного более короткая версия

Regex.Replace("410151000640", @"^(..)(..)(..)(...)(...)$", "$1-$2-$3-$4-$5");
10 голосов
/ 19 октября 2010

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

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));
}
3 голосов
/ 19 октября 2010

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

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

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

РЕДАКТИРОВАТЬ

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

string value = "410151000640";
for( int i = 2; i < value.Length-1; i+=3){
  if( value.Count( c => c == '-') >= 3) i++;
  value = value.Insert( i, "-");
}
2 голосов
/ 19 октября 2010

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

    MaskedTextProvider prov = new MaskedTextProvider("aa-aa-aa-aaa-aaa");
    prov.Set("41x151000a40");
    string result = prov.ToDisplayString();
0 голосов
/ 27 июля 2018

Вот простой метод расширения с некоторой утилитой:

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

Вы можете использовать его с любой строкой, и любой символ, кроме # в маске, будет вставлен. Маска будет работать справа налево. Вы можете настроить его, чтобы пойти другим путем, если хотите.

Веселись.

0 голосов
/ 19 октября 2010

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

Я создал это на лету, может быть, вы можете преобразовать его в 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
...