如何在.NET Framework中将双精度型转换为没有科学表示法的浮点字符串表示形式?

"小"样本(有效数量可以是任何大小,如1.5E2001e-200):

3248971234698200000000000000000000000000000000
0.00000000000000000000000000000000000023897356978234562

standard number formats都不是这样的,而且custom format似乎也不允许在小数点分隔符之后有一个开放的位数.

这不是How to convert double to string without the power to 10 representation (E-05)的重复,因为那里给出的答案确实是not解决了手头的问题.这个问题的公认解决方案是使用一个固定点(例如20位数),这不是我想要的.定点格式化和修剪冗余的0也不能解决问题,因为固定宽度的最大宽度是99个字符.

Note:解决方案必须正确处理自定义数字格式(例如,取决于区域性信息的其他小数分隔符).

Edit:这个问题实际上只是关于替换前面提到的数字.我知道浮点数是如何工作的,以及可以使用和计算哪些数字.

推荐答案

对于通用的ª解决方案,您需要保留339个位置:

doubleValue.ToString("0." + new string('#', 339))

非零小数的最大位数是16.小数点右侧有15位.指数可以将这15位最多向右移动324位.(See the range and precision.)

它适用于double.Epsilondouble.MinValuedouble.MaxValue以及介于两者之间的任何项目.

由于所有的格式化和字符串工作都是通过非托管CLR代码一次完成的,因此其性能将远远高于正则表达式/字符串操作解决方案.此外,代码更容易证明正确.

为了便于使用,甚至更好的性能,请将其设置为常量:

public static class FormatStrings
{
    public const string DoubleFixedPoint = "0.###################################################################################################################################################################################################################################################################################################################################################";
}

我错误地说这也是一个无损的解决方案.事实上并非如此,因为ToString对除r之外的所有格式都进行正常的四舍五入显示.Live example.谢谢,讨厌!如果您需要使用定点符号进行往返,请参阅Lothing’s answer(即,如果您现在使用.ToString("r")).

.net相关问答推荐

实体框架核心:Azure容器应用程序的执行超时已过期

如何从标头中检索基本身份验证凭据?

log4net 与 TraceSource

extern 在 C# 中是如何工作的?

编译错误:显式实现接口时修饰符 'public' 对此项目无效

我应该从 .NET 中的 Exception 或 ApplicationException 派生自定义异常吗?

struct 中需要覆盖什么以确保平等正常运行?

如何找到 ManualResetEvent 的状态?

如何将枚举值序列化为 int?

C#中的引用类型

C# - 你如何停止计时器?

为什么 C# 不推断我的泛型类型?

如何使用 C# 创建自签名证书?

如何防止任务的同步延续?

将月份 int 转换为月份名称

铸造:(NewType)与对象作为NewType

如何从 HashSet 中检索实际项目?

判断任意字符串是否为有效文件名的最简单方法

如何判断枚举是否包含数字?

枚举和匹配属性的 C# 命名约定