Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/308.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/security/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何格式化字符串以在C中包含空格#_C# - Fatal编程技术网

C# 如何格式化字符串以在C中包含空格#

C# 如何格式化字符串以在C中包含空格#,c#,C#,我的字符串是“234500012999922” 我想把它转换成:2345 0000 12 9999 22。模式始终是相同的AAAA BBBB CC DDDD EE但EE是可选的,可能无法填充。 我试过: string.format("{0:#### #### ## #### ##}); 没有成功。我使用了long变量而不是字符串,但仍然没有成功。在使用long时对我有效(PowerShell测试,应该与C相同): 试试这个: void Main() { var d = decimal.

我的字符串是“234500012999922”

我想把它转换成:2345 0000 12 9999 22。模式始终是相同的AAAA BBBB CC DDDD EE但EE是可选的,可能无法填充。

我试过:

string.format("{0:#### #### ## #### ##});

没有成功。我使用了
long
变量而不是字符串,但仍然没有成功。

在使用
long
时对我有效(PowerShell测试,应该与C相同):

试试这个:

void Main()
{
    var d = decimal.Parse("2345000012999922");

    Console.Out.WriteLine("{0:#### #### ## #### ##}", d);
}
首先转换为十进制,然后使用您自己的策略

数字的格式设置从右到左,这意味着如果您有两个数字,如下所示:

  • 234500001999922
  • 2345000129999
我们做了一些类似的事情:

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);
}
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
 2345 00 0012 99
0023 4500 00 1299 99
0000 2345 00 0012 99
(注意0-padding)

在格式字符串中,“0”表示在此处输入相应的数字(如果存在),否则用0填充。A“#”表示将相应的数字放在此处,如果存在,则忽略它

考虑到这一点,我认为你最好的策略是:

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);
}
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),则使用完整格式字符串

其他方法,如正则表达式和字符串操作也是很好的方法,尽管我怀疑它们的性能较差。但是,您应该测试所有方法,尤其是如果这段代码将运行很多次(例如,如果您在表中显示数据)

通过定义以下内容,可以使用扩展方法进一步提高代码的可读性

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);
}
注意:从末尾插入空格(即索引向下),以便可以使用原始字符串中的索引。如果您尝试另一种方法,则必须依次向每个索引添加1,以说明在当前添加空间的位置之前添加的新空间。不是很关键,但我认为如果索引与在原始字符串中添加空格的位置匹配,则更容易理解

string.Format("{0:#### #### ## #### ##}", 2345000012999922)
输出

2345 0000 12 9999 22
已编辑

这也适用于你

string str = "2345000012999922";

string str2 = string.Format("{0:#### #### ## #### ##}", Convert.ToDouble(str));

作为另一种方式(对于所有有点愚蠢的人):


你为什么不在你想要的地方加上空格?我的方法怎么样?我编辑了这篇文章。字符串的最后一部分EE my不存在。向字符串添加空格的好策略-即使字符串不是数字也有效。此方法将是我的选择,除非OP声明字符串将始终以模式
AAAA BBBB CC DDDD EE
计算为整数,并且我担心可能需要5个字符串分配比解析整数更昂贵,但与Grhm状态类似,如果原始字符串不是数字,这会更好。由于字符串的最后2个字符可能不存在,我通过在
Insert
方法的索引中添加一个字符,从左到右插入了空格。在这种情况下,
long
而不是
decimal
也会起作用。如果字符串的最后一个片段EE是可选?感谢您的努力,但我想我会接受@Matthew的答案,因为它很简单。如果字符串EE的最后一个片段是可选的,那该怎么办?这种方法可能会更好地使最后一位成为可选的,不过在这种情况下,我可能会使用预编译的正则表达式来提高列表数据的性能(这将被反复调用)。
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