Chakir Mohamed
Chakir Mohamed

Reputation: 19

How can I add a space between every 3 characters counting from the right to the left in a string in C#?

I want to add space between every 3 characters in a string in C#, but count from right to left.

For example :

11222333 -> 11 222 333

Upvotes: 1

Views: 1432

Answers (5)

Charlieface
Charlieface

Reputation: 71593

The most efficient algorithm I can come up with is the following:

    var sb = new StringBuilder(YourString.Length + YourString.Length / 3 + 1);
    if (YourString.Length % 3 > 0)
    {
        sb.Append(YourString, 0, YourString.Length % 3);
        sb.Append(' ');
    }
    
    for (var i = YourString.Length % 3; i < YourString.Length; i += 3)
    {
        sb.Append(YourString, i, 3);
        sb.Append(' ');
    }


    return sb.ToString();

We first assign a StringBuilder of the correct size.

Then we check to see if we need to append the first one or two characters. Then we loop the rest.

dotnetfiddle

Upvotes: 0

Charlieface
Charlieface

Reputation: 71593

Answer by @Jimi from comments (will delete if they post their own)

var YourString = "11222333";

var sb = new StringBuilder(YourString);
for (int i = sb.Length -3; i >= 0; i -= 3)
  sb.Insert(i, ' ');

return sb.ToString();

The benefit of this algorithm appears to be that you are working backwards through the string and therefore only moving a certain amount on each run, rather than the whole string.

Upvotes: 1

zett42
zett42

Reputation: 27766

Using Regex.Replace:

string input = "11222333";
string result = Regex.Replace( input, @"\d{3}", @" $0", RegexOptions.RightToLeft );

Demo and detailed explanation of RegEx pattern at regex101.

tl;dr: Match groups of 3 digits from right to left and replace them by space + the 3 digits.

Upvotes: 1

Steve
Steve

Reputation: 216303

If you are trying to format a string as a number according to some locale conventions you can use the NumberFormat class to set how you want a number to be formatted as a string

So for example

string input = "11222333";
NumberFormatInfo currentFormat = new NumberFormatInfo();
currentFormat.NumberGroupSeparator = " ";
if(Int32.TryParse(input, NumberStyles.None, currentFormat, out int result))
{
    string output = result.ToString("N0", currentFormat);
    Console.WriteLine(output); // 11 222 333
}

Upvotes: 1

Axel Kemper
Axel Kemper

Reputation: 11322

The following recursive function would do the job:

string space3(string s)
{
    int len3 = s.Length - 3;

    return (len <= 0) ? s 
          : (space3(s.Substring(0, len3)) + " " + s.Substring(len3));
}

C# 8.0 introduced string ranges. Ranges allow for a more compact form:

string space3(string s)
{
   return (s.Length <= 3) ? s 
             : (space3(s[..^3]) + " " + s[^3..]);
}

Upvotes: 0

Related Questions