生成十进制类型的往返字符串

问题描述 投票:0回答:3

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

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

但是,“R”格式没有为 decimal 类型定义(您会得到“FormatException:格式说明符无效”)。

如何生成小数类型的往返字符串?

c# floating-point type-conversion decimal
3个回答
14
投票

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


5
投票

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

编辑:.Net 7开始,您可以使用INumber接口创建通用

decimal
double
甚至异国情调的
Half
扩展方法(参见SandRock的评论如下):

using System.Globalization;
using System.Numerics;

...

public static class MyNumberExtensions {
  public static string ToInvariantString<T>(this T value) 
    where T : INumber<T>, IFormattable {
      return value.ToString("R", CultureInfo.InvariantCulture);
  }
}

然后

double d = 123.45;
decimal de = 446.93m;
int i = 456;
Half h = (Half)(5.1);
                
Console.WriteLine(string.Join(Environment.NewLine, 
  d.ToInvariantString(), 
  de.ToInvariantString(), 
  i.ToInvariantString(), 
  h.ToInvariantString()));

输出:

123.45
446.93
456
5.1

小提琴


1
投票

如果你尝试,

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

您会发现不需要任何额外的格式选项即可获得正确的

string
表示形式。

© www.soinside.com 2019 - 2024. All rights reserved.