【问题标题】:Converting a List of String to List of Double without losing information (VB.net)在不丢失信息的情况下将字符串列表转换为双精度列表 (VB.net)
【发布时间】:2023-03-12 22:47:01
【问题描述】:

我有一个字符串列表。当我尝试将条目转换为 Double 类型时,我丢失了信息(点)。我做错了什么?

 Dim list As New List(Of String)
 Dim a As Double

 list.Add("309.69686")
 a = CDbl(list(0))
 MsgBox(a)
'Output: 30969686

【问题讨论】:

  • 在您的国家/地区,数字的整数部分和小数部分之间的分隔符是什么?
  • 谢谢史蒂夫,这就是问题所在。我来自奥地利,所以分隔符是逗号而不是点。以某种方式明显的东西大声笑

标签: string vb.net list types double


【解决方案1】:

发生这种情况是因为在您的语言环境中,十进制数字的分隔符可能不是点而是其他东西(通常是逗号)。
您正在使用旧的 VB6 方法将此字符串转换为双精度字符串,而此方法 (CDbl) 无法使用不同的语言环境设置。

因此,在最基本的形式中,您需要将该方法更改为原生 .NET 方法

a = Double.Parse(list(0), CultureInfo.InvariantCulture)

在这里,我们传递有关 Parse 在将输入字符串转换为双精度时应使用的语言环境设置的信息。 InvariantCulture 使用点作为分隔符。

当然,您应该考虑到,如果输入字符串是从用户输入中获得的,那么您可能会遇到其他问题(例如无效的数字字符串)。在这种情况下,您不应使用 double.Parse,而应使用 double.TryParse

【讨论】:

  • 真的吗?老vb6?来自文档“作为一项规则,您应该优先使用 Visual Basic 类型转换函数而不是 .NET Framework 方法”......“Visual Basic 函数旨在与 Visual Basic 代码进行最佳交互”有一个单独的注释关于本地化,所以在这种情况下你是正确的,但我不明白你为什么拒绝 CInt 等。
  • 对不起,我觉得这些方法太照顾我了。就像在 a = CInt(Nothing) 中一样,那么如果你需要使用 C#,你就会在这些方面遇到困难
【解决方案2】:

如果您使用的是德语 Windows,那么点将被解释为千位分隔符。如果您需要其他行为,则必须明确指定文化。

Dim d = Double.Parse("309.69686", CultureInfo.InvariantCulture)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-03-22
    • 2012-06-23
    • 2012-04-14
    • 2015-01-10
    • 1970-01-01
    • 2011-05-11
    相关资源
    最近更新 更多