Scherling
Scherling

Reputation: 1390

Insert spaces into string using string.format

I've been using C# String.Format for formatting numbers before like this (in this example I simply want to insert a space):

String.Format("{0:### ###}", 123456);

output:

"123 456"

In this particular case, the number is a string. My first thought was to simply parse it to a number, but it makes no sense in the context, and there must be a prettier way.

Following does not work, as ## looks for numbers

String.Format("{0:### ###}", "123456");

output:

"123456"

What is the string equivalent to # when formatting? The awesomeness of String.Format is still fairly new to me.

Upvotes: 14

Views: 30213

Answers (8)

zcoop98
zcoop98

Reputation: 3089

I'm not sure it's any cleaner than simply inserting the space in this case, but these days (with C# 8+) you can also use ranges:

var str = "123456";
$"{str[..3]} {str[3..]}"; // "123 456"

(Assuming, of course, you have certain guarantees of your input's length.)

Upvotes: 0

Shubhada Fuge
Shubhada Fuge

Reputation: 242

As Heinzi pointed out, you can not have a format specifier for string arguments.

So, instead of String.Format, you may use following:

string myNum = "123456";
myNum = myNum.Insert(3, " ");

Upvotes: 9

InBetween
InBetween

Reputation: 32750

There is no way to do what you want unless you parse the string first.

Based on your comments, you only really need a simple formatting so you are better off just implementing a small helper method and thats it. (IMHO it's not really a good idea to parse the string if it isn't logically a number; you can't really be sure that in the future the input string might not be a number at all.

I'd go for something similar to:

 public static string Group(this string s, int groupSize = 3, char groupSeparator = ' ')
 {
     var formattedIdentifierBuilder = new StringBuilder();

     for (int i = 0; i < s.Length; i++)
     {
         if (i != 0 && (s.Length - i) % groupSize == 0)
         {
             formattedIdentifierBuilder.Append(groupSeparator);
         }

         formattedIdentifierBuilder.Append(s[i]);
     }

     return formattedIdentifierBuilder.ToString();
 }

EDIT: Generalized to generic grouping size and group separator.

Upvotes: 2

Baldrickk
Baldrickk

Reputation: 4409

We're doing string manipulation, so we could always use a regex.

Adapted slightly from here:

class MyClass
{
   static void Main(string[] args)
   {
      string sInput, sRegex;

      // The string to search.
      sInput = "123456789";

      // The regular expression.
      sRegex = "[0-9][0-9][0-9]";

      Regex r = new Regex(sRegex);

      MyClass c = new MyClass();

      // Assign the replace method to the MatchEvaluator delegate.
      MatchEvaluator myEvaluator = new MatchEvaluator(c.ReplaceNums);

      // Replace matched characters using the delegate method.
      sInput = r.Replace(sInput, myEvaluator);

      // Write out the modified string.
      Console.WriteLine(sInput);
   }

   public string ReplaceNums(Match m)
   // Replace each Regex match with match + " "
   {
      return m.ToString()+" ";
   }

}

How's that?

It's been ages since I used C# and I can't test, but this may work as a one-liner which may be "neater" if you only need it once:

sInput = Regex("[0-9][0-9][0-9]").Replace(sInput,MatchEvaluator(Match m => m.ToString()+" "));

Upvotes: 1

Joseph Jeganathan
Joseph Jeganathan

Reputation: 234

string is not a IFormattable

Console.WriteLine("123456" is IFormattable); // False
Console.WriteLine(21321 is IFormattable); // True

No point to supply a format if the argument is not IFormattable only way is to convert your string to int or long

Upvotes: 1

Patrick Hofman
Patrick Hofman

Reputation: 156978

The problem is that # is a Digit placeholder and it is specific to numeric formatting only. Hence, you can't use this on strings.

Either parse the string to a numeric, so the formatting rules apply, or use other methods to split the string in two.

string.Format("{0:### ###}", int.Parse("123456"));

Upvotes: 0

Kjartan
Kjartan

Reputation: 19111

Not very beautiful, and the extra work might outweigh the gains, but if the input is a string on that format, you could do:

var str = "123456";
var result = String.Format("{0} {1}", str.Substring(0,3), str.Substring(3));

Upvotes: 1

Tim Schmelter
Tim Schmelter

Reputation: 460108

You have to parse the string to a number first.

int number = int.Parse("123456");
String.Format("{0:### ###}", number);

of course you could also use string methods but that's not as reliable and less safe:

string strNumber =  "123456";
String.Format("{0} {1}", strNumber.Remove(3), strNumber.Substring(3));

Upvotes: 8

Related Questions