2

我的字符串是“2345000012999922”

我想将其转换为:2345 0000 12 9999 22。模式总是相同的 AAAA BBBB CC DDDD EE但 EE 是可选的,可能不会被填充。

我试过:

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

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

4

5 回答 5

5

试试这个:

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

    Console.Out.WriteLine("{0:#### #### ## #### ##}", d);
}

先转换成十进制,然后使用自己的策略。

数字的格式从右到左工作,这意味着如果您有 2 个数字,如下所示:

  • 2345000012999922
  • 23450000129999

我们做了类似的事情:

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

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

您可以通过定义类似的东西来使用扩展方法进一步提高代码的可读性

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);
}
于 2013-02-11T13:13:23.497 回答
4
string s = "2345000012999922";
s = s.Insert(14, " ").Insert(10, " ").Insert(8, " ").Insert(4, " ");
Console.WriteLine(s);

注意:从末尾插入空格(即索引向下),以便您可以使用原始字符串中的索引。如果您以另一种方式尝试,则必须向每个索引连续添加 1 以说明在当前添加空间的位置之前添加的新空间。不重要,但我认为索引是否与在原始字符串中添加空格的位置匹配更容易理解。

于 2013-02-11T13:13:46.293 回答
2

就像另一种方式一样(对于所有有点愚蠢的人):

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
于 2013-02-11T13:55:22.150 回答
1

使用时对我有用long(PowerShell 测试,对于 C# 应该是相同的):

PS> '{0:#### #### ## #### ##}' -f 2345000012999922
2345 0000 12 9999 22
于 2013-02-11T13:12:16.603 回答
0
string.Format("{0:#### #### ## #### ##}", 2345000012999922)

输出

2345 0000 12 9999 22

已编辑

这也对你有用

string str = "2345000012999922";

string str2 = string.Format("{0:#### #### ## #### ##}", Convert.ToDouble(str));
于 2013-02-11T13:20:36.937 回答