代码之家  ›  专栏  ›  技术社区  ›  NotDan

如何用逗号和小数格式化C#中的数字?

  •  11
  • NotDan  · 技术社区  · 14 年前

    我有一个小数点后位数可变的数字。我想用逗号和所有十进制数字来格式化这个数字。

    如果我用ToString(“N”)我只得到2个小数,ToString(“f”)给我所有的小数没有逗号。我怎样才能两者兼得?

    6 回复  |  直到 14 年前
        1
  •  12
  •   pdr    14 年前

    "#,##0.################"
    
        2
  •  4
  •   GalacticCowboy    14 年前
    string.Format("{0:#,##0.############}", value);
    

    “所有后续数字”没有自定义格式说明符,因此类似的内容最接近您想要的内容。

    还要注意的是,您受到变量精度的限制。A double 只有15-16位的精度,所以当你的左手边变大,小数位数就会减少。

        3
  •  3
  •   Community TheSoundDefense    7 年前

    更新 :查看 MSDN documentation on the System.Double type

    默认情况下,双精度值包含15 精度的小数位数 最多保留17位数字

    所以我想 pdr's on to something ,实际上。就这么做吧:

    // As long as you've got at least 15 #s after the decimal point,
    // you should be good.
    value.ToString("#,#.###############");
    

    有个主意:

    static string Format(double value)
    {
        double wholePart = Math.Truncate(value);
        double decimalPart = Math.Abs(value - wholePart);
        return wholePart.ToString("N0") + decimalPart.ToString().TrimStart('0');
    }
    

    例子:

    Console.WriteLine(Format(42023212.0092343234));
    

    42,023,212.00923432409763336

    哈,好吧,正如你所看到的,这给了不完美的结果,由于(我认为)浮点数学问题。哦,好吧;无论如何,这是一个选择。

        4
  •  0
  •   Akash Kava    14 年前

    尝试 ToString("N2")

        5
  •  0
  •   Abdullah Al Mamun Shiham    5 年前

    让我们试试这个

    [DisplayFormat(DataFormatString = "{0:0,0.00}")]

        6
  •  -1
  •   Jeeva Subburaj    14 年前

    这是达到你期望的方法。。。

    decimal d = 42023212.0092343234M;
    
    NumberFormatInfo nfi  = (NumberFormatInfo) CultureInfo.InvariantCulture.NumberFormat.Clone();
    
    nfi.NumberDecimalDigits= (d - Decimal.Truncate(d)).ToString().Length-2;
    
    Console.WriteLine(d.ToString("N",nfi));
    

    http://msdn.microsoft.com/en-us/library/system.globalization.numberformatinfo.aspx