Замена строки для персонализированного генератора кода - PullRequest
1 голос
/ 20 апреля 2010

Я должен сделать автоматический генератор кодов с настраиваемой пользователем строкой с предопределенными ключами и не могу найти хороший способ сделать это. Например, строка

OT-{CustomCode}-{Date}-{##}

может генерировать коды

OT-C0001-20100420-01

OT-C0001-20100420-02

Я думал об использовании RegExpr.Replace (), но у меня были бы проблемы, если бы код клиента был {##}

Любая помощь приветствуется! (и извините за мой английский)

Ответы [ 3 ]

1 голос
/ 20 апреля 2010

Вы можете использовать string.Format():

string generated = string.Format("OT-{0}-{1}-{2}", code, date, num);

{x} - это заполнители для заменяемых строк.

0 голосов
/ 20 апреля 2010

Класс StringBuilder обеспечивает эффективную замену:

string code = "C0001";
DateTime date = DateTime.Now;
int count = 1;
String formatString = "OT-{CustomCode}-{Date}-{##}";

StringBuilder sb = new StringBuilder(formatString);
sb.Replace("{CustomCode}", code);
sb.Replace("{Date}", date.ToString("yyyyMMdd"));
sb.Replace("{##}", count);
string result = sb.ToString();

Но это более полезно, если вы выполняете несколько замен для одних и тех же токенов. Похоже, вам нужен String.Format, предложенный Elisha

0 голосов
/ 20 апреля 2010

Вы имеете в виду, что определение автоматически сгенерированного кода, например:

Foo {##} , Bar {Date}

и это даст:

Foo 01 , Bar 20100420
Foo 02 , Bar 20100420

не так ли?

Я думаю, что RegExpr.Replace () - хорошее решение проблемы ##, вы можете сделать что-то вроде этого:

private void Generate()
{
    Regex doubleSharpRegEx = new Regex("{#+}");
    string customString = "Foo {####}";
    string[] generatedCodes = new string[3];
    for (int i = 0; i < generatedCodes.Length; i++)
    {
        string newString = doubleSharpRegEx.Replace(customString,
                                                    match =>
                                                    {
                                                        // Calculate zero padding for format
                                                        // remove brackets
                                                        string zeroPadding = match.Value.Substring(1, match.Value.Length - 2);
                                                        // replace # with zero
                                                        zeroPadding = zeroPadding.Replace('#', '0');

                                                        return string.Format("{0:" + zeroPadding + "}", i);
                                                    });
        generatedCodes[i] = newString;
    }
}

И массив сгенерированных кодов содержит:

Foo 0000
Foo 0001
Foo 0002
Foo 0003

EDIT: Лямбда-выражения работают только для фреймворка 3.5. Если вам нужно решение для 2.0, вы должны только заменить часть лямбда-выражения делегатом (очевидно, установив i для делегированного метода, например члена класса)

РЕДАКТИРОВАТЬ 2: Вы можете объединить ответ 2, например, в следующем коде:

private void Generate2()
{
    Regex customCodeRegex = new Regex("{CustomCode}");
    Regex dateRegex = new Regex("{Date}");
    Regex doubleSharpRegex = new Regex("{#+}");

    string customString = "Foo-{##}-{Date}-{CustomCode}-{####}";

    string newString = customCodeRegex.Replace(customString, "{0}");
    newString = dateRegex.Replace(newString, "{1}");
    newString = doubleSharpRegex.Replace(newString,
    match =>
    {
        string zeroPadding = match.Value.Substring(1, match.Value.Length - 2);
        zeroPadding = zeroPadding.Replace('#', '0');
        return "{2:" + zeroPadding + "}";
    });

    string customCode = "C001";
    string date = DateTime.Today.ToString("yyyyMMdd");
    string[] generatedCodes = new string[3];
    for (int i = 0; i < generatedCodes.Length; i++)
    {
        generatedCodes[i] = string.Format(newString, customCode, date, i);
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...