使用string.format将空格插入到字符串中

时间:2014-10-07 10:11:12

标签: c#

我之前一直在使用C#String.Format来格式化数字(在这个例子中我只是想插入一个空格):

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

输出:

"123 456"

在这种特殊情况下,数字是一个字符串。我的第一个想法是简单地将其解析为一个数字,但在上下文中没有任何意义,并且必须有一个更漂亮的方式。

以下不起作用,因为##查找数字

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

输出:

"123456"

格式化时等效于#的字符串是什么? String.Format的优秀性对我来说还是一个新手。

7 个答案:

答案 0 :(得分:6)

正如Heinzi指出的那样,你不能拥有字符串参数的格式说明符。

因此,您可以使用以下命令代替String.Format:

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

答案 1 :(得分:5)

您必须先将字符串解析为数字。

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

当然你也可以使用字符串方法,但这不可靠且不太安全:

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

答案 2 :(得分:1)

不是很漂亮,额外的工作可能会超过收益,但如果输入是该格式的字符串,你可以这样做:

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

答案 3 :(得分:1)

问题是#数字占位符,它特定于numeric formatting only。因此,你不能在字符串上使用它。

将字符串解析为数字,因此应用格式规则,或使用其他方法将字符串拆分为两个。

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

答案 4 :(得分:1)

string不是IFormattable

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

如果参数不是IFormattable,则无需提供格式,只能将字符串转换为intlong

答案 5 :(得分:1)

除非先解析字符串,否则无法做你想做的事。

根据您的评论,您只需要一个简单的格式,这样您最好只是实现一个小帮助方法就可以了。 (恕我直言,如果它不是逻辑上一个数字,解析字符串并不是一个好主意;你不能确定将来输入字符串可能根本不是一个数字。

我会选择类似的东西:

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

编辑:广义为通用分组大小和组分隔符。

答案 6 :(得分:1)

我们正在进行字符串操作,因此我们总是可以使用正则表达式。

略微改编自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()+" ";
   }

}

那是怎么回事?

自从我使用C#以来已经很久了,我无法测试,但这可能是一个单行程,可能是&#34; neater&#34;如果你只需要一次:

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