Что самый эффективный путь состоит в том, чтобы отформатировать следующую строку?

У меня есть очень простой вопрос, и я не должен быть одержим этим, но я. Ха-ха!

У меня есть строка, которую я получаю в следующем формате (форматах):

123

123456-D53

123455-4D

234234-4

123415

Желаемый вывод, форматирование сообщения:

123-455-444

123-455-55

123-455-5

или

123-455

Формат в конечном счете зависит от общего количества символов в исходной строке..

У меня есть несколько идей того, как сделать это, но я сохраняю вещь существует лучший путь, чем строка. Замените и конкатенируйте...

Спасибо за предложения..

Ian

5
задан Ian P 20 May 2010 в 18:02
поделиться

5 ответов

Я полагаю, это не просто полагается на то, что входные данные всегда являются числовыми? Если так, я думаю о чем-то вроде этого

private string ApplyCustomFormat(string input)
{
    StringBuilder builder = new StringBuilder(input.Replace("-", ""));

    int index = 3;
    while (index < builder.Length)
    {
        builder.Insert(index, "-");
        index += 4;
    }
    return builder.ToString();
}
2
ответ дан 13 December 2019 в 22:03
поделиться

Tanascius прав, но я не могу комментировать или повышать голос из-за отсутствия репутации, но если вам нужна дополнительная информация о string.format, я нашел это полезным. http://blog.stevex.net/string-formatting-in-csharp/

4
ответ дан 13 December 2019 в 22:03
поделиться

РЕДАКТИРОВАТЬ: См. Историю старых версий.
Вы можете использовать char.IsDigit () только для поиска цифр.

var output = new StringBuilder();
var digitCount = 0;

foreach( var c in input )
{
  if( char.IsDigit( c ) )
  {
    output.Append( c );
    digitCount++;
    if( digitCount % 3 == 0 )
    {
      output.Append( "-" );
    }
  }
}

// Remove possible last -
return output.ToString().TrimEnd('-');

Этот код должен заполняться слева направо (теперь я понял, сначала прочитал, потом код) ...
Извините, я все еще не могу проверить это прямо сейчас.

2
ответ дан 13 December 2019 в 22:03
поделиться

Не самый быстрый, но легкий для глаз (ed: to read):

string Normalize(string value)
{
    if (String.IsNullOrEmpty(value)) return value;

    int appended = 0;
    var builder = new StringBuilder(value.Length + value.Length/3);
    for (int ii = 0; ii < value.Length; ++ii)
    {
        if (Char.IsLetterOrDigit(value[ii]))
        {
            builder.Append(value[ii]);
            if ((++appended % 3) == 0) builder.Append('-');
        }
    }

    return builder.ToString().TrimEnd('-');
}

Использует предположение для предварительного распределения длины StringBuilder. Принимается любой алфавитно-цифровой ввод с любым количеством мусора, добавляемого пользователем, включая лишние пробельные символы.

0
ответ дан 13 December 2019 в 22:03
поделиться

Вот метод, который использует комбинацию регулярных выражений и LINQ для извлечения групп из трех букв за раз, а затем снова их объединение. Примечание: предполагается, что ввод уже был проверен. Проверка также может выполняться с помощью регулярного выражения.

string s = "123456-D53";
string[] groups = Regex.Matches(s, @"\w{1,3}")
                       .Cast<Match>()
                       .Select(match => match.Value)
                       .ToArray();
string result = string.Join("-", groups);

Результат:

123-456-D53
2
ответ дан 13 December 2019 в 22:03
поделиться
Другие вопросы по тегам:

Похожие вопросы: