【问题标题】:Formatting a large number with commas用逗号格式化大数字
【发布时间】:2009-09-01 23:10:40
【问题描述】:

我需要格式化一个数字,以便用逗号分隔任何超过 10000 的数字(包括 10000)。例如,10000 变为 10,000,但 9999 仍为 9999。

我想使用格式字符串来执行此操作,因为我不想测试数据以查看它是否在哪个范围内。

有人知道怎么做吗?

【问题讨论】:

    标签: c# formatting numbers


    【解决方案1】:

    格式字符串对于不同的值不能有不同的表现,因此您能做的最好的事情是:

    int n;
    
    string s = n >= 10000 ? n.ToString("n0") : n.ToString("d");
    

    (这将使用用户的文化;如果需要不同的文化,请传递 INumberFormatInfo/CultureInfo。)

    MSDN:StandardCustom Numeric Format Strings

    【讨论】:

    • OP 明确声明他们“不想通过测试数据来查看它在什么范围内”。不过,这是最明智的做法,所以 +1。
    • 嗯...我认为我的解决方案更接近于满足不需要范围检查的要求。
    • 顺便说一下,如果您要除以正数、负数和零,您可以执行多种格式。见这里:msdn.microsoft.com/en-us/library/0c899ak8.aspx#SectionSeparator 除了那些以外,你不能这样做。
    【解决方案2】:
    num > 9999 ? num.ToString("N0", CultureInfo.InvariantCulture) : num.ToString();
    

    “N0”假设你不想要小数。 NFormat

    【讨论】:

      【解决方案3】:

      我建议创建您自己的 IFormatProvider,它具有快速长度检查功能,如果它是五个或更多字符,则通常使用千位分隔符格式化它,如果它是四个或更少字符,则不使用千位分隔符。

      您可以轻松修改MSDN docs on IFormatProvider 中的示例。

      【讨论】:

        【解决方案4】:

        必须在某个级别进行范围检查。如果你这样实现,你可以在某种程度上将范围检查嵌入到格式框架中,如果数字少于 5 位,则绕过默认格式(包括组分隔符):

        class MyFormat : System.IFormatProvider, ICustomFormatter
        {
            #region IFormatProvider Members
        
            public object GetFormat(Type formatType)
            {
                return this;
            }
        
            #endregion
        
        
            #region ICustomFormatter Members
        
            public string Format(string format, object arg, IFormatProvider formatProvider)
            {
                if (arg is double)
                    if (((double)arg >= 10000) || ((double)arg <= -10000))
                        return ((double)arg).ToString(format);
                    else
                        return ((double)arg).ToString("R");
        
                if (arg is decimal)
                    if (((decimal)arg >= 10000) || ((decimal)arg <= -10000))
                        return ((decimal)arg).ToString(format);
                    else
                        return ((decimal)arg).ToString("R");
        
                return arg.ToString();
            }
        
            #endregion
        }
        
        class Program
        {
            static MyFormat gFormat = new MyFormat();
        
            static void Main(string[] args)
            {
        
                double dblVal1 = 9999, dblVal2 = 123456;
                Console.WriteLine(String.Format(gFormat, "{0:N0} {1:N0}", dblVal1, dblVal2));
            }
        }
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2014-05-31
          • 2020-12-18
          • 2017-12-09
          • 2011-11-08
          • 1970-01-01
          • 2010-10-16
          • 1970-01-01
          相关资源
          最近更新 更多