Home > Back-end >  How can I add a space between every 3 characters counting from the right to the left in a string in
How can I add a space between every 3 characters counting from the right to the left in a string in

Time:06-13

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

CodePudding user response:

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
}

CodePudding user response:

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..]);
}

CodePudding user response:

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.

CodePudding user response:

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.

CodePudding user response:

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

  • Related