【问题标题】:Trying to convert string into double C#?试图将字符串转换为双 C#?
【发布时间】:2014-04-04 13:50:37
【问题描述】:
 double test = Convert.ToDouble("39,618840‎");

这给了我一个格式异常,我尝试使用 Cultureinfo.invariantculture 设置,它也是一样的。

【问题讨论】:

  • 我们应该将其解释为 3900 万(等等),还是 39“和一点”?两者都是有效的解释......
  • 不变文化需要一个点作为小数分隔符,而不是逗号。您需要指定使用逗号分隔符的区域性。

标签: c# visual-studio xaml windows-phone culture


【解决方案1】:

您在零之后有一个尾随的不可见字符。删除它。

然后,这行得通:

var culture = CultureInfo.GetCultureInfo("FR-fr");       
var qty = Convert.ToDouble("39,618840", culture);

【讨论】:

  • ok 生病标记为已回答谢谢,但现在显然我的下一个问题是如何删除它,但我会创建一个新问题 thanx
  • 备案,8206为以下字符:U+200E left-to-right mark
  • @user2042227 的答案是“找到它出现的时间点,并从源头删除它”
  • 不,我明白了,但问题是它是一个动态字符串,所以需要创建一个删除特殊 invis 字符的方法
  • @user2042227 您可能更愿意删除您不期望的所有内容 - 有 LOT 的 unicode 字符;p 0123456789.,-+E 将是一个很好的起点
【解决方案2】:

该字符串中有一些无效字符。

查看十六进制字符串,我们看到以下内容:

"39,618840‎" --> 0x22, 0x33, 0x39, 0x2c, 0x36, 0x31, 0x38, 0x34, 0x30, 0xe2, 0x80, 0x8e, 0x22

而且这些字符实际上看起来像:

"39,618840â€Ẑ"

【讨论】:

  • 实际上,我会说“它们的样子”是一个无形的标记。最后几个字节实际上只是一个字符。一定要喜欢 unicode。
  • 您显示的字节是 UTF-8 编码的。如果你在software.hixie.ch/utilities/cgi/unicode-decoder/utf8-decoder 输入22 33 39 2c 36 31 38 34 30 e2 80 8e 22,你会发现它看起来不像â€Ẑ,除非你混淆了编码。 E2 80 8E 解码为U+200E left-to-right mark,一个不可见的格式化字符。
  • 我对 unicode 的卓越知识表示敬意,但我觉得 Marc Gravell 已经正确地陈述了事情(但以更好的方式):p
【解决方案3】:
        if (myString.Contains(","))
            myString = myString.Replace(",", "");
        double mydouble = Double.Parse(myString);

使用上述方法会将字符串解析为双精度,您的问题是逗号。如果您打算将逗号用作小数点,则可以进行以下修改:

        myString = myString.Replace(",", ".");

【讨论】:

  • 用句点替换逗号不是处理国际格式的正确方法。然而,碰巧的是,国际格式不是这里的问题。问题实际上是一个不相关的 unicode 字符。
猜你喜欢
  • 1970-01-01
  • 2015-08-06
  • 2013-10-10
  • 2015-04-10
  • 1970-01-01
  • 2020-10-16
  • 1970-01-01
  • 2012-04-21
  • 2012-07-09
相关资源
最近更新 更多