【问题标题】:convert double to string and show decimal values only if required [duplicate]仅在需要时将双精度转换为字符串并显示十进制值[重复]
【发布时间】:2014-05-21 17:43:18
【问题描述】:

我想将以下 3 个双精度值转换为字符串。

Double value            converted string value
1                       1
1.200                   1.200
1.666                   1.666

我希望我的输出字符串值与双精度格式相同。表示上述值 1 没有任何十进制值,因此它将保持不变。如果是 1.200,它将给我字符串 1.200 和 1.666 相同。但是我尝试了 .ToString() 方法,但它截断了 1.200 值的零值。但我不想要这个。我想要字符串格式的实际值。

【问题讨论】:

  • 我认为您不需要“实际”值(即 1.2000000000001)
  • “我希望我的输出字符串值与双精度格式相同” - 您的意思是要区分 1.20 和 1.200 的原始字符串输入吗?如果是这样,double 是错误的类型。如果这不是你的意思,你真的需要努力让你的问题变得清晰。我们不知道数据来自哪里,或者您所说的“与双精度格式相同”是什么意思。
  • 如果你想控制双精度的输出,使用格式化。例如string.Format("{0:0.000}", myDouble) 方法将格式化一个双精度数,使其在小数点左侧至少有一个符号,在小数点右侧至少有 3 位。如果你想在变量声明中输出准确的值,并在double v1 = 1;double v2 = 1.000;之间做出区别,那么double不是你的数据类型——语言在11.000之间没有区别,除非两者都是字符串。
  • 嗨@JonSkeet,我的意思是我不想截断小数位后的零值。实际上这些值来自数据库。所以我希望这些值在字符串转换后保持不变(相同的小数位)。
  • C# 不区分 1.2 和 1.200 和 1.20000 如果它存储为双精度类型。如果您创建 3 个双变量并将这些值分配给它们并将它们打印出来或对彼此执行比较测试,它们都是相等的,您会看到这一点。因此,在使用双精度类型时,尾随零并不是真正的值的一部分,您只能使用专门的格式打印它们。 (编辑:Ivaylo 基本上说了同样的话,在发表评论之前我没有注意到它。哎呀)

标签: c# typeconverter


【解决方案1】:

我承认我不喜欢这样做的想法,但是我为 Double 类型编写了一个扩展方法来格式化它。随意更改有趣的名称。 :)

public static class StupidDouble
{
    public static string StupidFormat(this double theValue)
    {
        // geth the double value to three decimal points
        string s = string.Format("{0:0.000}", theValue);

        // get the whole number value
        int check = (int) Math.Truncate(theValue);

        // if the format of the int matches the double, display without decimal places
        if (string.Format("{0:0.000}", check) == s)
        {
            s = check.ToString();
        }

        return s;
    }
}

【讨论】:

  • 请注意,这不会处理 Double 的全部范围。希望您的数据具有合理的价值。
  • 我认为这种方法唯一愚蠢的就是您选择的名称。也许,如果格式作为参数出现(而不是硬编码),我什至会考虑在我的日常工作中使用这种方法(不是开玩笑):)
【解决方案2】:

C# 或任何其他语言(包括 SQL)不会根据浮点类型(floatdouble)在代码中的表示来区分它们的值。

这意味着编译器不区分:

double v1 = 1;

double v2 = 1.000;

您说(在 cmets 中)从哪里获取这些值的数据库也没有。

数据库以某种方式显示小数的原因是因为预定义的格式应用于结果集。这可以由您使用的数据库工具定义,也可以取决于您的区域系统设置。无论如何,.NET 框架为您提供explicitly format your data 的功能。

您需要决定哪种格式最适合您的需要并使用它。例如,这将格式化点后 4 位小数的数字:

String.Format("{0:0.0000}", v1); // outputs 1.0000
String.Format("{0:0.0000}", v2); // outputs 1.0000 too

如果您已经知道所需的格式,请调整格式字符串(第一个参数看起来像 "{0:0000}",以最符合您的要求的方式。

【讨论】:

  • 对于 C# 中的 decimal,这不是正确的。 1.00m 和 1.0000m 不同 - 尝试将它们打印出来。 doublefloat 是这样,但 decimal 不是。
  • @JonSkeet,是的,确实如此(我承认,只是我真的尝试过)。我知道decimal 的表示形式比浮点类型更特殊,但我并不怀疑这种差异有那么大。感谢您的提示,现在修复答案。
  • 请记住,decimal 也是一个浮点类型。只是它是浮点decimal点类型,不是浮点binary点类型。
猜你喜欢
  • 2015-06-14
  • 2014-05-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-08-13
  • 2019-08-31
  • 1970-01-01
相关资源
最近更新 更多