Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/331.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#十进制以删除0';s_C#_Format_Decimal_Tostring - Fatal编程技术网

如何格式化C#十进制以删除0';s

如何格式化C#十进制以删除0';s,c#,format,decimal,tostring,C#,Format,Decimal,Tostring,我想将字符串格式化为十进制,但十进制后包含以下一些零。如何设置格式,使那些无意义的0消失 string.Format("{0}", 1100M); string.Format("{0}", 1100.1M); string.Format("{0}", 1100.100M); string.Format("{0}", 1100.1000M); 显示: 1100 1100.1 1100.100 1100.1000 但我希望它是: 1100 1100.1 1100.1 1100.1 作为参考,以

我想将字符串格式化为十进制,但十进制后包含以下一些零。如何设置格式,使那些无意义的0消失

string.Format("{0}", 1100M);
string.Format("{0}", 1100.1M);
string.Format("{0}", 1100.100M);
string.Format("{0}", 1100.1000M);
显示:

1100
1100.1
1100.100
1100.1000
但我希望它是:

1100
1100.1
1100.1
1100.1
作为参考,以下是其他问题,这些问题本质上是重复的,这要感谢这里给出的答案:

您可以这样指定:

String.Format("{0:0.000}", x);

它们并不一定毫无意义——它们表明了计算过程中的精度。小数保持其精度水平,而不是标准化

我有一些代码,其中将返回一个规范化的值-您可以使用它,然后格式化结果。例如:

using System;
using System.Numerics;

class Test
{
    static void Display(decimal d)
    {
        d = d.Normalize(); // Using extension method from other post
        Console.WriteLine(d);
    }

    static void Main(string[] args)
    {
        Display(123.4567890000m); // Prints 123.456789
        Display(123.100m);        // Prints 123.1
        Display(123.000m);        // Prints 123
        Display(123.4567891234m); // Prints 123.4567891234
    }
}

我怀疑大多数格式化字符串的方法都会失败。我猜一个格式字符串“0”,然后是28个字符就可以了,但这会非常难看…

我相信你想做:

var s = String.Format("{0:#####.###}");

已经有不少答案了。我经常提到这张备忘单:

有些粗俗,但这应该有用:

decimal a = 100.00M;
string strNumber = string.Format("{0}", a);
Console.WriteLine(strNumber.Contains('.') ? strNumber.TrimEnd('0').TrimEnd('.') : strNumber);
那么:

string FormatDecimal(decimal d)
{
    const char point = System.Globalization.NumberFormatInfo.CurrentInfo.NumberDecimalSeparator[0];
    string s = d.ToString();
    // if there's no decimal point, there's nothing to trim
    if (!s.Contains(point) == -1)
        return s;
    // trim any trailing 0s, followed by the decimal point if necessary
    return s.TrimEnd('0').TrimEnd(point);
}
您可以与一起使用
ToString()
,以获得所需的结果。以指定的精度使用此格式字符串时,尾随零将被截断。为了防止在任何情况下进行舍入,需要将精度设置为小数允许的最大值(29)

生成所需内容的代码行是
number.ToString(“G29”)
,其中
number
是原始小数


请注意,任何小于0.0001的数字都将转换为科学记数法。有关此格式化程序工作原理的更多详细信息,请参见上面的参考链接。

与大家建议使用
G
格式说明符不同,我建议使用以下方法来保留千位分隔符和小数点,同时删除额外的尾随零:

string s = d.ToString("0.#############################");
{0:#,#.##}
在大多数情况下,此格式的结果比G好得多:

String.Format("{0:#,#.##}",25/2.4);
10.42

String.Format("{0:#,#.##}",1000000);
1,000,000

String.Format("{0:#,#.##}",1000000.3600000);
1,000,000.36
而且
G
说明符不能真正处理所有可能的组合:

String.Format("{0:G29}",25/2.4);
10.416666666666668

String.Format("{0:G2}",25/2.4);
10

String.Format("{0:G29}",1000000.3600000);
1000000.36

String.Format("{0:G2}",1000000.3600000);
1E+06

但我不知道它的末尾有三个小数,我的意思是,这只是一个例子。我会让问题更清楚。1002.231只是一个例子吗?也就是说,您希望1.12000是1.12还是1.120?请注意,如果您想要十进制值,则应使用一个,例如1100.1000m。请注意“十进制文字”的“m”。@Jon:谢谢,我也注意到了这一点,并去修复它,当我回来时,你的评论正在等着我。。太快了……;)@n8wrl:只是一个例子,是的,我更新了更多的例子。应该是。。。String.Format(“{0:0.0##}”,123.456789m)ThanksIt看起来您的解决方案仅适用于.Net 4.0。@Gabe:除非您使用第三方BigInteger实现,否则是的。它也相当低效。另一方面,它有工作的优势:)确认!如果a=100.000怎么办?或者
a=0
?@Gabe正在fixing@kerk现在应该修好了。如果您发现更新后的答案有任何反例,请告诉我。如果更新后的答案仍然不令人满意,请删除下一票。使用System.Globalization.NumberFormatInfo.CurrentInfo.NumberDecimalSeparator而不是“.”。我认为这是问题的最佳解决方案。Concur--切换答案。谢谢,@Herohtar.WARNING:注意0.000001之类的值。G29格式将以尽可能短的方式显示它们,因此它将切换到指数表示法。string.Format(“{0:G29}”),decimal.Parse(“0.00000001”),System.Globalization.CultureInfo.GetCultureInfo(“en-U”)‌​)将给出“1E-08”作为结果。康拉德的功劳在这里:@DougS:对于小于0.0001的数字(例如,0.0001保持不变,但0.00009将是9E-05),似乎在大多数情况下,想要截断零不太可能是个问题,但知道这一点是件好事。G29是没有必要的。“G0”=“G29”表示十进制
String.Format("{0:#,#.##}",25/2.4);
10.42

String.Format("{0:#,#.##}",1000000);
1,000,000

String.Format("{0:#,#.##}",1000000.3600000);
1,000,000.36
String.Format("{0:G29}",25/2.4);
10.416666666666668

String.Format("{0:G2}",25/2.4);
10

String.Format("{0:G29}",1000000.3600000);
1000000.36

String.Format("{0:G2}",1000000.3600000);
1E+06