【问题标题】:Formatting a String to be Converted to Double格式化要转换为双精度的字符串
【发布时间】:2023-03-03 13:37:01
【问题描述】:

我正在尝试将 string 转换为 double。传入的字符串总是一个整数......没有小数。所以,例如“90”。

double percentToCheck = Convert.ToDouble(String.Format("{0:0.00}", SomeEntity.KeyIDs.SomePercentTrigger));

SomePercentTrigger 是我要转换的百分比。

我得到一个“字符串格式不正确”的错误,那么我应该如何格式化这个字符串?我必须对其进行格式化,因为如果不这样做,我会在转换过程中遇到同样的错误:

double percentToCheck = Convert.ToDouble(SomeEntity.KeyIDs.SomePercentTrigger);

更新:

SomePercentTrigger 只是一个 string 例如“80”..它也总是一个整数。

【问题讨论】:

  • SomePercentTrigger 实际上是什么样子的?
  • 你有输入数据的例子吗?
  • 做,你尝试了 Double.Parse() 来实现这一点。
  • @kalyan Convert.ToDouble() 实际上使用 double.Parse()
  • @CoffeeAddict 如果该字符串确实是“80”,这意味着您是第一个发现框架最常用功能之一中的主要错误的人。这对我来说似乎相当难以置信

标签: c# string type-conversion


【解决方案1】:

更新:
你的字符串是"52.0"

必须是'.' 导致FormatException
您可能在一台机器上,'.'没有设置为小数点(例如,我住在德国并使用德国区域设置。我们的小数点是 ','

要解决这个问题,您需要使用CultureInfo.InvariantCulture 解析字符串。

var value = double.Parse(myString, CultureInfo.InvariantCulture);

InvariantCulture 应该用于应用程序中围绕数据存储的部分。确保在将双精度转换为字符串时也使用它Console.WriteLine(value.ToString(CultureInfo.InvariantCulture));


我怀疑SomeEntity.KeyIDs.SomePercentTrigger 中有一些无效字符(除了数字、'.' 和可选的前导'-'),例如“80%”

所以你在这条线上得到了一个FormatException

double percentToCheck = Convert.ToDouble(String.Format("{0:0.00}", SomeEntity.KeyIDs.SomePercentTrigger));

因为{0:0.00} 格式化规则只对数值有效。

你也得到了同样的例外:

double percentToCheck = Convert.ToDouble(SomeEntity.KeyIDs.SomePercentTrigger);

因为“80%”不能转换成双精度数。

你应该

  • 在失败的语句前面添加一些日志记录
  • 或调试该代码

看看SomeEntity.KeyIDs.SomePercentTrigger实际内容是什么。

【讨论】:

  • 同意,如果字符串格式化和解析不起作用,明显的原因是数据错误。
  • 示例的传入数据是“52.0”
  • @CoffeeAddict 您需要使用CultureInfo.InvariantCulture 来获取“。”右:double.Parse(SomeEntity.KeyIDs.SomePercentTrigger, CultureInfo.InvariantCulture)
【解决方案2】:

使用double.Parse(string)double.TryParse(string, out value)

【讨论】:

  • Convert.ToDouble() 实际上使用了double.Parse()。如果前者失败,后者也会失败。
【解决方案3】:

尝试格式化字符串是没有意义的。您必须先将其解析为数字才能对其进行格式化。无论如何,将没有小数的数字解析为双精度数没有问题,因此该字符串可能不包含您认为的内容。

如果字符串包含整数格式的数字,则将字符串解析为整数,然后将整数转换为双精度:

double percentToCheck = (double)Int32.Parse(SomeEntity.KeyIDs.SomePercentTrigger);

【讨论】:

  • 使用它仍然会出错。 SomePercentTrigger 的值为 52.0,这是我的代码,它仍然向我抛出字符串格式错误: double percentToCheck = (double)Int32.Parse( SomeEntity.KeyIDs.SomePercentTrigger);
  • @CoffeeAddict:如果SomePercentTrigger 包含字符串"52.0",那么它就不是没有小数的数字。它被格式化为浮点数,所以你必须像这样解析它:double percentToCheck = double.Parse(SomeEntity.KeyIDs.SomePercentTrigger, CultureInfo.InvariantCulture);
  • 它甚至没有采用不变的结构......我得到一个“CultureInfo”在当前上下文中不存在
  • @CoffeAddict:CultureInfo.InvariantCulture 始终使用句点作为小数分隔符,无论本地文化设置如何。顶部需要using System.Globalization;,或者在代码中指定System.Globalization.CultureInfo.InvariantCulture
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2020-02-04
  • 2011-08-11
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多