如何格式化字符串以在C#中包含空格
本文关键字:包含 空格 格式化 字符串 | 更新日期: 2023-09-27 17:58:43
我的字符串是"234500001299922"
我想把它转换成:2345 0000 12 9999 22。图案总是相同的AAAA BBBB CC DDDD EE,但EE是可选的,可能不会填充
我试过了:
string.format("{0:#### #### ## #### ##});
没有成功。我使用了long
变量而不是字符串,但仍然没有成功。
试试这个:
void Main()
{
var d = decimal.Parse("2345000012999922");
Console.Out.WriteLine("{0:#### #### ## #### ##}", d);
}
首先转换成十进制,然后使用自己的策略。
数字格式从右到左有效,这意味着如果你有两个数字,如下所示:
- 23450000012999922
- 234500000129999
我们做了一些类似的事情:
void Main()
{
var d1 = decimal.Parse("23450000129999");
var d2 = decimal.Parse("234500001299");
Console.Out.WriteLine("{0:#### #### ## #### ##}", d1);
Console.Out.WriteLine("{0:#### #### ## #### ##}", d2);
Console.Out.WriteLine("{0:0000 0000 00 0000 00}", d1);
Console.Out.WriteLine("{0:0000 0000 00 0000 00}", d2);
}
我们会得到:
23 4500 00 1299 99
2345 00 0012 99
0023 4500 00 1299 99
0000 2345 00 0012 99
(请注意0填充)。
在格式字符串中,"0"表示将相应的数字放在此处(如果存在),否则用0填充。"#"的意思是,如果存在,将相应的数字放在这里,否则忽略它。
考虑到这一点,我认为你最好的策略是:
void Main()
{
var s1 = "23450000129999";
var s2 = "234500001299";
var n1 = s1.Length;
var n2 = s2.Length;
var c = 12;
var f1 = "{0:#### #### ## #### ##}";
var f2 = "{0:#### #### ## ####}";
var d1 = decimal.Parse(s1);
var d2 = decimal.Parse(s2);
Console.Out.WriteLine(n1 > c ? f1 : f2, d1);
Console.Out.WriteLine(n2 > c ? f1 : f2, d2);
}
这将给出:
23 4500 00 1299 99
23 4500 00 1299
其思想是首先检查输入字符串的字符串长度。如果它是12,那么最后一个可选位不存在,所以您使用截断的格式字符串。如果它大于12(或等于14),则使用完整格式字符串。
regex和字符串操作等其他方法也是不错的方法,尽管我怀疑它们的性能较差。不过,您应该测试所有方法,尤其是如果这段代码将运行很多次(例如,如果您在表中显示数据)。
通过定义类似的东西,可以使用扩展方法进一步提高代码的可读性
public static class FormattingHelper
{
public static string GetFormatString(this string s)
{
if (s.Length == 12)
return "{0:#### #### ## ####}";
else
return "{0:#### #### ## #### ##}";
}
}
void Main()
{
var s1 = "23450000129999";
var s2 = "234500001299";
var d1 = decimal.Parse(s1);
var d2 = decimal.Parse(s2);
Console.Out.WriteLine(s1.GetFormatString(), d1);
Console.Out.WriteLine(s2.GetFormatString(), d2);
}
string s = "2345000012999922";
s = s.Insert(14, " ").Insert(10, " ").Insert(8, " ").Insert(4, " ");
Console.WriteLine(s);
注意:从末尾插入空格(即索引向下),这样您就可以使用原始字符串中的索引。如果您尝试另一种方式,则必须在每个索引中依次添加1,以说明在当前添加空间的位置之前添加的新空间。不重要,但我认为如果索引与原始字符串中添加空格的位置匹配,会更容易理解。
就像另一种方法一样(对于所有略显愚蠢的人):
string input = "2345000012999922";
string Formatted = new Regex(@"('d{4})('d{4})('d{2})('d{4})('d{2})").
replace(input, "$1 $2 $3 $4 $5");
//Formatted = 2345 0000 12 9999 22
在使用long
时对我有效(PowerShell测试,应该与C#相同):
PS> '{0:#### #### ## #### ##}' -f 2345000012999922
2345 0000 12 9999 22
string.Format("{0:#### #### ## #### ##}", 2345000012999922)
输出
2345 0000 12 9999 22
已编辑
这也适用于
string str = "2345000012999922";
string str2 = string.Format("{0:#### #### ## #### ##}", Convert.ToDouble(str));