【问题标题】:formatting string in MVC /C#MVC / C#中的格式化字符串
【发布时间】:2011-04-01 10:02:54
【问题描述】:

我有一个字符串 731478718861993983,我想使用 C# 得到这个 73-1478-7188-6199-3983。我怎样才能像这样格式化它?

谢谢。

【问题讨论】:

标签: c# asp.net asp.net-mvc-3


【解决方案1】:

通过使用正则表达式:

    public static string FormatTest1(string num)
    {
        string formatPattern = @"(\d{2})(\d{4})(\d{4})(\d{4})(\d{4})";
        return Regex.Replace(num, formatPattern, "$1-$2-$3-$4-$5");
    }

    // test
    string test = FormatTest1("731478718861993983");
    // test result: 73-1478-7188-6199-3983

【讨论】:

  • 好多了...我要退休了。
  • 如果你有 1 个问题并通过正则表达式解决,你现在有 2 个问题 :)
  • @mathieu - 如果你有问题并应用格言和教条式思维,那么我不确定你有什么。
【解决方案2】:

如果您处理的是long 号码,您可以使用NumberFormatInfo 对其进行格式化:

首先,定义你的 NumberFormatInfo(你可能需要额外的参数,这些是基本的 3 个):

NumberFormatInfo format = new NumberFormatInfo();
format.NumberGroupSeparator = "-";
format.NumberGroupSizes = new[] { 4 };
format.NumberDecimalDigits = 0;        

接下来,您可以在号码上使用它:

long number = 731478718861993983;
string formatted = number.ToString("n", format);
Console.WriteLine(formatted);

毕竟,.Net 具有非常好的全球化支持 - 使用它会更好!

【讨论】:

  • 这个问题是关于一个字符串,而不是很长,所以它需要被转换,就像其他答案一样。
  • @Steve - 我知道,我实际上故意忽略了那部分!我添加了another answer for strings,并添加了这个用于数字格式。无论哪种方式,如果需要,OP 应该知道如何转换字符串,但这不是问题的核心。
  • 是的,但我的迂腐评论确实有一点,如果字符串更长,可能无法解析为长字符串,因此基于“纯”字符串的答案不需要转换值得考虑,尽管由于您的回答被接受了,我想这无论如何都不是问题。
【解决方案3】:
string s = "731478718861993983"
var newString = (string.Format("{0:##-####-####-####-####}", Convert.ToInt64(s));

【讨论】:

    【解决方案4】:

    仅 LINQ 单行:

    var str = "731478718861993983";
    var result = 
        new string(
            str.ToCharArray().
                Reverse(). // So that it will go over string right-to-left
                Select((c, i) => new { @char = c, group = i / 4}). // Keep group number
                Reverse(). // Restore original order
                GroupBy(t => t.group). // Now do the actual grouping
                Aggregate("", (s, grouping) => "-" + new string(
                    grouping.
                        Select(gr => gr.@char).
                        ToArray())).
                ToArray()).
        Trim('-');
    

    这可以处理任意长度的字符串。

    【讨论】:

    • 一个班轮....我们有不同的定义。只是因为你可以把它放在一条线上......
    • @kenny:纯属练习。
    【解决方案5】:

    简单(和幼稚)的扩展方法:

    class Program
    {
        static void Main(string[] args)
        {
            Console.WriteLine("731478718861993983".InsertChar("-", 4));
        }
    }
    
    static class Ext
    {
        public static string InsertChar(this string str, string c, int i)
        {
            for (int j = str.Length - i; j >= 0; j -= i)
            {
                str = str.Insert(j, c);
            }
    
            return str;
        }
    }
    

    【讨论】:

      【解决方案6】:

      如果您要严格处理字符串,您可以制作一个简单的 Regex.Replace,以捕获每组 4 位数字:

      string str = "731478718861993983";
      str = Regex.Replace(str, "(?!^).{4}", "-$0" ,RegexOptions.RightToLeft);
      Console.WriteLine(str);
      

      注意使用RegexOptions.RightToLeft,从右边开始捕获(所以"12345"将被替换为1-2345,而不是-12345),使用(?!^)避免添加破折号开始。
      您可能只想捕获数字 - 一个可能的模式可能是 @"\B\d{4}"

      【讨论】:

        【解决方案7】:
        string myString = 731478718861993983;
        myString.Insert(2,"-");
        myString.Insert(7,"-");
        myString.Insert(13,"-");
        myString.Insert(18,"-");
        

        【讨论】:

          【解决方案8】:

          我的第一个想法是:

          String s = "731478718861993983";
          s = s.Insert(3,"-");
          s = s.Insert(8,"-");
          s = s.Insert(13,"-");
          s = s.Insert(18,"-");
          

          (不记得索引是否从零开始,在这种情况下您应该使用我的值 -1) 但可能有一些更简单的方法可以做到这一点......

          【讨论】:

            【解决方案9】:

            如果“-”的位置总是一样的可以试试

            string s = "731478718861993983";
            s = s.Insert(2, "-");
            s = s.Insert(7, "-");
            s = s.Insert(12, "-");
            s = s.Insert(17, "-"); 
            

            【讨论】:

              【解决方案10】:

              这就是我的做法;仅当您将数字存储为非字符串时它才有效,因为它们不能与格式字符串一起使用。

              string numbers = "731478718861993983";
              string formattedNumbers = String.Format("{0:##-####-####-####-####}", long.Parse(numbers));
              

              编辑:修改代码,因为您说它们在您的原始问题中作为字符串保存

              【讨论】:

              • 啊,是的,我错过了。给我几分钟,我会修改。很好发现。
              • @kenny 我显然可以PadLeft() 最长为 22,但这仅适用于最多两个前导零。回到绘图板!
              猜你喜欢
              • 2014-11-02
              • 2013-07-09
              • 2021-05-09
              • 2016-10-05
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              相关资源
              最近更新 更多