У меня есть очень простой вопрос, и я не должен быть одержим этим, но я. Ха-ха!
У меня есть строка, которую я получаю в следующем формате (форматах):
123
123456-D53
123455-4D
234234-4
123415
Желаемый вывод, форматирование сообщения:
123-455-444
123-455-55
123-455-5
или
123-455
Формат в конечном счете зависит от общего количества символов в исходной строке..
У меня есть несколько идей того, как сделать это, но я сохраняю вещь существует лучший путь, чем строка. Замените и конкатенируйте...
Спасибо за предложения..
Ian
Я полагаю, это не просто полагается на то, что входные данные всегда являются числовыми? Если так, я думаю о чем-то вроде этого
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();
}
Tanascius прав, но я не могу комментировать или повышать голос из-за отсутствия репутации, но если вам нужна дополнительная информация о string.format, я нашел это полезным. http://blog.stevex.net/string-formatting-in-csharp/
РЕДАКТИРОВАТЬ: См. Историю старых версий.
Вы можете использовать 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('-');
Этот код должен заполняться слева направо (теперь я понял, сначала прочитал, потом код) ...
Извините, я все еще не могу проверить это прямо сейчас.
Не самый быстрый, но легкий для глаз (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
. Принимается любой алфавитно-цифровой ввод с любым количеством мусора, добавляемого пользователем, включая лишние пробельные символы.
Вот метод, который использует комбинацию регулярных выражений и 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