如何在.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相关问答推荐

无法在Ubuntu 22.04.3上运行带有Rider 2023和DotNet-8.0的项目

使用CLR将数据从Excel导入SQL Server时出错

.NET Core 中的微服务

使用 DataDog 收集 OpenTelemetry 跟踪

AppShell - 返回导航失败,匹配的路由不明确......但我只注册了一次路由

在本地运行 Azure 函数会在 .NET7 升级后出现无运行时错误

在接口内部声明 IEnumerable 而在具体类中声明 IList

使属性只能通过绑定的 Editor(component) 编辑

将 Moq 模拟对象传递给构造函数

在 C# 中获取 log4net 日志(log)文件

如何在没有抽象基类的情况下强制覆盖后代中的方法?

mstest.exe 在哪里?

基于多个字符分隔符拆分字符串

WCF服务客户端:内容类型text/html;响应消息的charset=utf-8 与绑定的内容类型不匹配

关于 Enumerable.Range 与传统 for 循环的 foreach 的思考

等待 Async Void 方法调用以进行单元测试

Find() 和 First() 抛出异常,如何改为返回 null?

从字节数组中读取 C# 中的 C/C++ 数据 struct

WPF 中的 Application.DoEvents() 在哪里?

判断数据表中是否包含空值的最佳方法