8

这可能很愚蠢,但这让我很难过。我需要将 a 转换/格式化为double强制string小数点。

1         => 1.0
0.2423423 => 0.2423423
0.1       => 0.1
1234      => 1234.0

基本上,我想输出所有小数,但也要确保四舍五入的值也有冗余.0。我确信有一种简单的方法可以实现这一目标。

4

6 回答 6

7

使用double.ToString("N1")

double d1 = 1d;
double d2 = 0.2423423d;
double d3 = 0.1d;
double d4 = 1234d;
Console.WriteLine(d1.ToString("N1"));
Console.WriteLine(d2.ToString("N1"));
Console.WriteLine(d3.ToString("N1"));
Console.WriteLine(d4.ToString("N1"));

演示

标准数字格式字符串

数字 ("N") 格式说明符

更新

(1.234).ToString("N1") 产生 1.2,除了删除额外的十进制数字外,它还添加了千位分隔符

好吧,也许您需要实现一个自定义NumberFormatInfo对象,您可以从 current 派生CultureInfo并使用 in double.ToString

var culture = CultureInfo.CurrentCulture;
var customNfi = (NumberFormatInfo)culture.NumberFormat.Clone();
customNfi.NumberDecimalDigits = 1;
customNfi.NumberGroupSeparator = "";
Console.WriteLine(d1.ToString(customNfi));

请注意,您需要克隆它,因为默认情况下它是只读的。

演示

于 2013-03-27T12:11:52.893 回答
5

没有内置方法可以使用该方法将强制附加.0到整数末尾.ToString(),因为现有格式将根据您指定的小数位数截断或舍入。

我的建议是使用扩展方法滚动您自己的实现

public static String ToDecmialString(this double source)
{
    if ((source % 1) == 0)
        return source.ToString("f1");
    else
        return source.ToString();

}

以及用法:

double d1 = 1;
double d2 = 0.2423423;
double d3 = 0.1;
double d4 = 1234;
Console.WriteLine(d1.ToDecimalString());
Console.WriteLine(d2.ToDecimalString());
Console.WriteLine(d3.ToDecimalString());
Console.WriteLine(d4.ToDecimalString());

输出结果:

1.0
0.2423423
0.1
1234.0
于 2013-03-27T12:26:58.417 回答
3

你可以这样做:如果数字没有小数点,你可以格式化它的输出以强制一个小数点 0,如果它有小数位,只需使用 ToString();

double a1 = 1;
double a2 = 0.2423423;
string result = string.Empty;
if(a1 - Math.Floor(a1) >0.0)
       result = a1.ToString();    
else
       result = a1.ToString("F1"); 

if (a2 - Math.Floor(a2) > 0.0)
       result = a2.ToString();
else
       result = a2.ToString("F1");

当您"F"用作格式时,输出将不包含千位分隔符,它后面的数字指定小数位数。

于 2013-03-27T12:20:34.813 回答
0

使用 ToString("0.0###########################")。

它确实有效。我发现它与您的问题十进制 ToString 格式重复,它至少给出 1 位数字,没有上限

于 2014-03-15T08:51:46.723 回答
0

Double 提供了一种方法ToString(),您可以在其中传递IFormatProvider-object 说明您希望如何double转换。

0此外,它应该不惜一切代价显示尾随。

value = 16034.125E21;
// Display value using the invariant culture.
Console.WriteLine(value.ToString(CultureInfo.InvariantCulture));
// Display value using the en-GB culture.
Console.WriteLine(value.ToString(CultureInfo.CreateSpecificCulture("en-GB")));
// Display value using the de-DE culture.
Console.WriteLine(value.ToString(CultureInfo.CreateSpecificCulture("de-DE")));
// This example displays the following output to the console: 
//       -16325.62015 
//       -16325.62015 
//       -16325,62015 
//       1.6034125E+25 
//       1.6034125E+25 
//       1,6034125E+25

是来自 MSDN 的文档。

于 2013-03-27T12:12:16.237 回答
-1

如果没有给出小数点,您可以转换为字符串,然后附加“.0”

string sValue=doubleValue.ToString();
if(!sValue.Contains('.'))
    sValue+=".0";

编辑:正如评论中提到的那样。可能不是当前文化中的小数分隔符。如果您想为这种情况保存代码,请参阅本文以检索实际的分隔符。

于 2013-03-27T12:11:59.097 回答