Отформатируйте строку в C # (не число или дату) для данного шаблона - PullRequest
0 голосов
/ 30 октября 2018

Есть ли что-то вроде string.format для форматирования строк, где я могу передать шаблон цели. string.format, кажется, только для форматирования чисел и шаблонов и вставки значений в заданную позицию. Есть ли общее решение для форматирования строк по заданному шаблону, чем программирование его самостоятельно?

Я хочу дать шаблон цели и строку ввода и получить строку в шаблоне, который я предоставил.

Я могу привести несколько примеров.

Input               Output           Input pattern (idea)
---------------------------------------------------------
123.456.001         00123.456.001    00000.000.###
D1234567            D-123-4567       D-000-#### (where D is literal)

Итак, мой вопрос: есть ли способ отформатировать string для данного шаблона, как для числа и даты?

Ответы [ 2 ]

0 голосов
/ 30 октября 2018

Я хотел бы рассмотреть возможность создания пользовательских классов форматирования для каждого из необходимых вам форматов. Ниже приведен очень простой пример без обработки ошибок и т. Д. *

// custom formatter class
public class FormatD : IFormattable
{
    public string ToString(string format, IFormatProvider provider)
    {
        return format[0] + "-" + format.Substring(1,3) + "-" + format.Substring(4);
    }
}

Для звонка:

 var input = "D1234567";
 var ouput = String.Format("{0:" + input + "}", new FormatD());
0 голосов
/ 30 октября 2018

Это не совсем возможно с String.Format(). Вам нужно будет анализировать различные части вашего шаблона, используя регулярные выражения или аналогичные.

Для вашего примера решение может быть

public string ReplacePattern(string input)
{
    var match = Regex.Match(input, @"([A-Z])(\d{3})(\d{4})");
    if(match.Groups.Count == 4) // The first group is always the input
    {
        return String.Format("{0}-{1}-{2}", match.Groups.Skip(1).Take(3).ToArray());
    }
    return "";
}

Редактировать: Я забыл: конечно, вы всегда можете использовать замены регулярных выражений:

public string ReplacePattern(string input)
{
    return Regex.Replace(input, @"([A-Z])(\d{3})(\d{4})", "$1-$2-$3");
}
...