tags:

views:

62

answers:

3

I must do a automatic codes generator with user-configurable string with predefined keys and can not find a good way to do it. For example, a string

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

could generate codes

OT-C0001-20100420-01

OT-C0001-20100420-02

I thought of using RegExpr.Replace(), but I would have problems if the code of a customer was {##}

Any help is welcome! (and sorry for my english)

+1  A: 

You can use string.Format():

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

The {x} are placeholders for strings to be replaced.

Elisha
A: 

Do you mean an auto-generated code definition is for example:

Foo {##} , Bar {Date}

and that will produce:

Foo 01 , Bar 20100420
Foo 02 , Bar 20100420

don't you ?

I think RegExpr.Replace() is a good solution, to the ## problem you can do something like this:

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

And the array generatedCodes contains:

Foo 0000
Foo 0001
Foo 0002
Foo 0003

EDIT: Lambdas expression work only for framework 3.5. If you need a solution for 2.0, you must only replace the lambda expression part with a delegate (obviously setting i available for the delegated method e.g. class member)

EDIT 2: You can combine the 2 answer for example in the following code:

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);
    }
}
digEmAll
A: 

The StringBuilder class provides an efficient replace:

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

But this is more useful if you're doing multiple replaces for the same tokens. Looks like you need String.Format as suggested by Elisha

pmawhinney