【问题标题】:Produce a round-trip string for a decimal type为十进制类型生成往返字符串
【发布时间】:2014-02-14 03:14:22
【问题描述】:

如果我想将一个 double 转换为一个 string 并返回一个完全匹配的 double,我会使用类似:

double d1 = 1 / 3.0;
string s = d1.ToString("R");
double d2 = double.Parse(s);

但是,没有为 decimal 类型定义“R”格式(您会收到“FormatException: Format specifier was invalid”)。

产生十进制类型的往返字符串的方法是什么?

【问题讨论】:

  • 代码是有效的 C#,并且(至少对于给定的示例)按预期/描述的方式工作。我不知道现在那里的代码是不是@musefan 看到的。
  • @TimS.:实际上,我错过了整个double/decimal 事情......我的错
  • 小数的字符串格式已经是小数的精确值了。 这是小数点
  • @EricLippert 我不知道变化是否发生在过去 6 年,但对我来说是在fi 语言环境(123.123m).ToString() -> 123,123。必须使用(123.123m).ToString(System.Globalization.CultureInfo.InvariantCulture) -> 123.123。让$"{123.123:r}" 抛出 FormatException 是烦人的 AF。

标签: c# type-conversion decimal


【解决方案1】:

如果你尝试,

decimal d1 = 1m / 3;
string s = d1.ToString();
decimal d2 = decimal.Parse(s);
// where d1 == d2 = true

您会发现不需要任何额外的格式选项来获得正确的string 表示。

【讨论】:

    【解决方案2】:

    Decimal 实际上是一个二进制十进制值(它使用 10 的底数,而不是 Double 中的 2)这就是为什么不需要像ToString("R") 这样的特殊精确表示;

      Decimal value = 123.456m;
      String result = value.ToString(CultureInfo.InvariantCulture); // <- That's enough 
    

    详情参见:

    http://csharpindepth.com/articles/general/decimal.aspx

    【讨论】:

      【解决方案3】:

      decimal 往返的默认输出格式,因此您无需执行任何特殊操作。从这个意义上说,它就像int

      【讨论】:

      • 必须使用什么转换方法从字符串生成小数,以确保“1.20”产生 1.20m 而不是 1.2m?
      • @supercat:您将使用decimal.Parse("1.20") 来获得 1.20m 的回馈——如果您使用double.Parse("1.20"),您将获得 1.2d 的回馈。
      • 我很困惑,因为 VB.NET 即时模式打印功能 [我用来测试简单 .NET 方法的行为] 出于某种原因截断了尾随零;添加.ToString() 解决了这个问题。
      猜你喜欢
      • 2013-04-07
      • 2013-02-11
      • 1970-01-01
      • 1970-01-01
      • 2018-06-24
      • 2013-09-21
      • 1970-01-01
      • 2018-03-12
      • 1970-01-01
      相关资源
      最近更新 更多