如何将包含指数数的字符串转换为十进制并返回字符串

2023-11-30

我正在 delphi 和 c# 之间转换代码。
值作为字符串存储在 delphi 应用程序的文本文件中。存储值的示例为:“4.42615029219009E-5”

现在,在我的 C# 应用程序中,我需要读入该字符串值,然后能够再次写出该值。最初我使用的代码类似于:

string stringField = "4.42615029219009E-5";
double someMoneyVar = Convert.ToDouble(stringField)

稍后,如果我需要使用 someMoneyVar 的值重新创建文本文件,则使用简单的:

string.Format("{0}", someMoneyVar)

会输出:

4.42615029219009E-05 // note the 0

最后,我读到在 C# 中最好将钱存储为小数。我尝试使用将字符串值转换为小数decimal.Parse(someMoneyVar, NumberStyles.Any),但是格式会丢失。

我需要将数据完全按照输入的方式输出。

请注意,someMoneyVar 的值可能并不总是包含指数部分。例如0.0428860331919443。如果 someMoneyVar 的值没有指数部分,则该值将正确写入文本文件。

Update:
深入delphi的浮点转字符串函数和帮助文件(将值存储在文本文件中)我附带了以下内容:

如果数字位数,则结果字符串使用定点格式 数值小数点左边小于或等于 达到指定的精度,并且如果该值大于或等于 至 0.00001(编辑:这应该是0.0001。delphi文档中有错误)。否则结果字符串使用科学格式, Digits 参数指定中的最小位数 指数(0 到 4 之间)。
...
如果正值部分为空,或者整个格式 字符串为空,该值使用通用浮点格式 格式化为 15 位有效数字,对应于调用 FloatToStrF 与ff通用格式。通用浮点数 如果值超过 18 位,也会使用格式化 小数点左边且格式字符串未指定 科学计数法。

因此请记住浮点转字符串函数调用浮动到StrF使用 15 个有效(精度)数字和 0 作为最小位数,因此我们最终得到

4.42615029219009E-5

如果数字是 2 那么数字将显示为

4.42615029219009E-05

根据 MSDNhttp://msdn.microsoft.com/en-us/library/dwhawy9k.aspx#GFormatString
使用通用格式说明符,双精度数为15,十进制为29

如果指数由以下结果产生,则使用定点表示法 用科学记数法表示大于-5的数字并且 小于精度说明符;否则,科学计数法是 用过的。如果需要,结果包含小数点,并且尾随 小数点后的零被省略。如果精度说明符 存在且结果中有效位数超过 指定的精度,多余的尾随数字被删除 四舍五入。

但是,如果数字是 Decimal 并且精度说明符是 省略,始终使用定点表示法,并且尾随零 保存下来。

如果使用科学记数法,则结果中的指数带有前缀 如果格式说明符为“G”,则为“E”,如果格式说明符为“e” 说明符是“g”。指数至少包含两位数。这 与生成的科学计数法格式不同 指数格式说明符,至少包括三个 指数中的数字。

结果字符串受格式信息的影响 当前 NumberFormatInfo 对象。下表列出了 NumberFormatInfo 控制结果格式的属性 细绳。

人们可以轻松设置精度,例如mydecimal.toString("G15") 但是我仍然没有找到一种方法可以像在delphi中一样轻松地设置“E”符号后的位数浮动到StrF功能


要将字符串转换为数字,正如您已经想到的,您只需使用double。 不过我会尝试不同的转换:

double myNum = double.Parse("<yournumber>", NumberStyles.AllowExponent | NumberStyles.Float, CultureInfo.InvariantCulture);

AllowExponent and Float应保留符号,并且InvariantCulture处理小数分隔符(根据区域设置,它可能不是点)。

您可以通过以下方式输出科学计数法数字string.Format(), 像这样:

double num = 1234.5678; // 1.2345678e+03
string.Format("{0:e}", num); // should output "1.2345678E+03"

如果您必须区分带有和不带有“E+xx”部分的数字,则必须在将字符串转换为双精度之前搜索它,完整的片段(警告:未经测试!)可能如下所示:

string myString = ReadNumberFromFile(); // Just a placeholder method
double myNum = double.Parse(myString, NumberStyles.AllowExponent | NumberStyles.Float, CultureInfo.InvariantCulture);
string output = string.Empty; //this will be the "converted-back number" container
if (myString.IndexOf("e", StringComparison.OrdinalIgnoreCase) >= 0)
{
    //Number contains the exponent
    output = string.Format("{0:e}", num); // exponential notation 'xxxExx' casing of 'e' changes the casing of the 'e' in the string
}
else
{
    //TODO: Number does NOT contain the exponent
    output = string.Format("{0:f}", num); // fixed-point notation in the form 'xxxx.xxx'
}

这里的要点是,就数字而言,with or without指数没有任何区别,这只是一个表示问题(区分它们没有什么意义:这实际上是一样).

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何将包含指数数的字符串转换为十进制并返回字符串 的相关文章

  • crt0 是否加载 msvcrt.dll?

    我想弄清楚标准 C 函数是什么样的printf 在 Windows 环境下加载到内存中 我知道crt0 obj准备堆栈 调用int main int argc char argv 然后使用 main 返回的退出代码退出进程 我还听说 C 标
  • 如何获取列表框中项目的索引?

    我正在将项目添加到ListBox像这样 myListBox Items addRange myObjectArray 我还想通过以下方式选择我添加的一些项目 foreach MyObject m in otherListOfMyObject
  • 在 Silverlight 中同步操作

    我有一个 Silverlight 应用程序 它使用操作从模型获取数据 再次从 WCF 服务获取数据 我需要以某种方式同步两个 ActionCallback 或等待它们 然后执行一些代码 Example model GetMyTypeList
  • System.Drawing.dll / NumericUpDown 的 .NET 访问冲突异常

    我遇到了一个非常愚蠢的问题 我已经尝试完全重新安装 NET 但它没有解决问题 我什至无法通过谷歌搜索找到其他有同样问题的人 就在我的计算机上 如果我将 NumericUpDown 控件添加到 NET 项目中的窗体并运行该应用程序 则在运行该
  • 将 python 字典翻译为 C++

    我有包含以下代码的 python 代码 d d 0 0 0 d 1 2 1 d 2 1 2 d 2 3 3 d 3 2 4 for i j in d print d i j d j i 不幸的是 对于我的目的来说 循环遍历 python 中
  • 为什么表达式树不能包含命名参数规范?

    使用 AutoMapper 我找到了一个非常适合命名参数的地方 ForMember s gt s MyProperty opt gt opt MapFrom s gt BuildMyProperty s isAdvanced false 但
  • 在 C# 中将 Exe 文件作为嵌入式资源运行

    我有一个第 3 方 EXE 我只需要从我的 C 应用程序运行它 我的主要目标是对我的 C 文件中的第 3 方可执行文件进行版权保护 有没有更好的方法来做到这一点 我怎样才能做到这一点 首先将嵌入的可执行文件作为资源文件添加到您现有的资源文件
  • 在硬件不足的情况下进行编码

    我目前正在使用 C 中的 SIMD 指令进行编码 并尝试使用 IDE 在实时编码时显示错误 拼写错误等 问题是 我使用的是 AVX512 指令 我的硬件不支持这些指令 只有我用于编译的服务器支持 有没有一种方法可以在 IDE 中进行错误检查
  • 如何将值从控制器传递到asp.net中的视图?

    我正在开发一个应用程序 我需要将用户名的值从控制器传递到视图 我尝试了 ViewData 中给出的http msdn microsoft com en us library system web mvc viewdatadictionary
  • std::function 中参数的自动动态转换

    我们有多态类 A 和 B 例如 struct A virtual A struct B final public A void f std cout lt lt f lt lt std endl 我想分配一个变量std function
  • 更改 ASP.NET 控件的访问修饰符

    如果我像这样将控件放入 aspx 文件中
  • 将模型和订阅密钥传递给 LuisDialog,而不是通过属性

    我正在编写一个可以说两种语言的机器人 因此 我需要使用两个单独的 LUIS 应用程序 每种语言一个 Bot Framework 中的 LuisDialog 是这样初始化的 来自 Microsoft 的示例 LuisModel c413b2e
  • 底层连接已关闭:接收时发生意外错误

    我来这里是因为我在通过 ftp 协议下载一些文件时遇到问题 这很奇怪 因为它偶尔会发生 甚至对于同一个文件也是如此 只是一个精确度 我正在下载非常大的文件 从 500 Mo 到 30Go 以下是我的函数返回的异常类型 抱歉 这是法语 Sys
  • WCF Xml 与二进制序列化的优缺点

    我知道如果我将二进制序列化与 WCF 一起使用 我就会失去互操作性 如果我愿意接受这一点 我想知道使用二进制比 Xml 是否有效率优势 如果还有我上面没有提到的其他优点和缺点 是的 可能是一个大事件 XML 序列化数据比二进制数据要大 使用
  • 如何使用 PostSharp 拦截基类上的方法调用?

    我想提供一个实现System Object ToString使用 PostSharp 到各种类 我创建了一个继承自的方面MethodInterceptionAspect但是OnInvoke调用时不会调用方法EchoDto ToString发
  • 使用signinmanager成功登录后,用户仍然显示为已注销?

    我已将 Asp Net 身份框架添加到从前端调用的 WebAPI 中 注册帐户后 并看到它在数据库中正确显示 我使用该用户的用户名和密码登录 结果成功 但根据登录管理器 用户未登录 我尝试使用 cookie 身份验证使用此示例 https
  • ASPNET MVC - 使用具有相同签名的新助手覆盖 Html.TextBoxFor(model.property)?

    我想用我自己的助手重写 Html TextBoxFor 该助手具有完全相同的签名 当然 但名称空间不同 这是否可能 如果可以 如何实现 原因是我在现有的应用程序中有 100 多个视图 并且我想更改 TextBoxFor 的行为 以便在属性具
  • Lambda 通过引用捕获右值引用

    下面的代码标准正确吗 godbolt https godbolt org z VE0NWz IE by ref 捕获表示临时的转发引用 并从函数返回结果 lambda 按值 在同一个表达式中 当然 存储 lambda 供以后使用会使其包含悬
  • ASP.NET 中的 ThreadStaticAttribute

    我有一个需要存储的组件static每个线程的值 它是一个通用组件 可以在许多场景中使用 而不仅仅是在 ASP NET 中 我想用 ThreadStatic 属性来实现我的目标 假设它在 ASP NET 场景中也能正常工作 因为我假设每个请求
  • 如何在 Ubuntu x64 中使用 ptrace 插入 int3?

    我正在努力追随本指南 http eli thegreenplace net 2011 01 27 how debuggers work part 2 breakpoints 通过设置断点达到相同的结果 唯一的区别是我在 x64 系统上 所以

随机推荐