7

i want to find a efficent way to do :

i have a string like :

'1,2,5,11,33'

i want to pad zero only to the numbers that below 10 (have one digit)

so i want to get

'01,02,05,11,33'

thanks

Haim Evgi
  • 123,187
  • 45
  • 217
  • 223

2 Answers2

21

How much do you really care about efficiency? Personally I'd use:

string padded = string.Join(",", original.Split(',')
                                         .Select(x => x.PadLeft(2, '0')));

(As pointed out in the comments, if you're using .NET 3.5 you'll need a call to ToArray after the Select.)

That's definitely not the most efficient solution, but it's what I would use until I'd proved that it wasn't efficient enough. Here's an alternative...

// Make more general if you want, with parameters for the separator, length etc
public static string PadCommaSeparated(string text)
{
    StringBuilder builder = new StringBuilder();
    int start = 0;
    int nextComma = text.IndexOf(',');
    while (nextComma >= 0)
    {
        int itemLength = nextComma - start;
        switch (itemLength)
        {
            case 0:
                builder.Append("00,");
                break;
            case 1:
                builder.Append("0");
                goto default;
            default:
                builder.Append(text, start, itemLength);
                builder.Append(",");
                break;
        }
        start = nextComma + 1;
        nextComma = text.IndexOf(',', start);
    }
    // Now deal with the end...
    int finalItemLength = text.Length - start;
    switch (finalItemLength)
    {
        case 0:
            builder.Append("00");
            break;
        case 1:
            builder.Append("0");
            goto default;
        default:
            builder.Append(text, start, finalItemLength);
            break;
    }
    return builder.ToString();
}

It's horrible code, but I think it will do what you want...

Jon Skeet
  • 1,421,763
  • 867
  • 9,128
  • 9,194
  • 1
    Nice answer. For .NET3.5 folks, remember to convert the `IEnumerable` to `string[]` before handing off to `string.Join` –  Dec 13 '10 at 19:48
5
string input= "1,2,3,11,33";
string[] split = string.Split(input);
List<string> outputList = new List<string>();
foreach(var s in split)
{
    outputList.Add(s.PadLeft(2, '0'));
}

string output = string.Join(outputList.ToArray(), ',');
Mark Avenius
  • 13,679
  • 6
  • 42
  • 50