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

mhe*_*man 12 c# decimal type-conversion

如果我想要一个转换字符串,然后返回到匹配正好,我会使用类似:

double d1 = 1 / 3.0;
string s = d1.ToString("R");
double d2 = double.Parse(s);
Run Code Online (Sandbox Code Playgroud)

但是,"R"格式没有为十进制类型定义(您得到"FormatException:格式说明符无效").

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

Gab*_*abe 12

decimal往返的默认输出格式,因此您不必做任何特殊的事情.就像int在那个意义上一样.


Dmi*_*nko 5

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

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

详细信息另请参阅:

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

编辑:.Net 7开始,您可以使用INumber接口创建通用甚至decimaldouble异国情调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);
  }
}
Run Code Online (Sandbox Code Playgroud)

然后

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()));
Run Code Online (Sandbox Code Playgroud)

输出:

123.45
446.93
456
5.1
Run Code Online (Sandbox Code Playgroud)

小提琴