2017-07-17 26 views
-1

的截图总结了问题:Double.Parse失败为“10.00”检索到的值

enter image description here

我在检索到的值没有控制权。它带有一些我无法弄清楚的时髦格式,即使看起来完全正常,解析也失败了。在手动输入值工作得很好。

我如何“正常化”的检索值,因此Decimal.Parse不会失败?

仅供参考,这里是未通过字符串(复制和粘贴):

“10.00”

+0

该不该无法解析 – Rahul

+0

哪种文化是你的机器? –

+8

从PowerShell:'“10.00”.Length'返回'6'。那么,是否会有某种隐藏的角色?当然是。你的字符串以['U + 200E LEFT-TO-RIGHT MARK'(http://www.fileformat.info/info/unicode/char/200e/index.htm)。如果您的用户应该能够进入,那么可能需要某种标准化。 –

回答

1

你可能有某种特殊字符隐藏您检索字符串中的。

试试这个:

Double.Parse(Regex.Replace(decimalValue, @"[^0-9.,]+", "")) 

您可能需要使用语句添加为System.Text.RegularExpressions

+0

这工作!谢谢。工作示例:https://dotnetfiddle.net/M1cFWi – tnw

+0

不客气。我忘了提及我正在使用这个只会得到正值的变量。如果您也要接收负值,请将您的正则表达式更改为@“[^ 0-9。,] + - ”(注意添加 - ) –

+0

@“[^ 0-9。,] + - ”是废话,无论如何,整个方法不是一个好主意。它将AW57等非数字字符串转换为数字(57)并将数字转换为不同的数字(如1E7转换为17)。它以相当不可预测的方式改变输入,使得整个程序不可靠。 –

-1

如的Jeroen Mostert在评论中提到,有一个在您decimalValue非打印的字符。

这是一个类似的问题,这应有助于你面对这一切。

https://stackoverflow.com/a/15259355/7636764

编辑:

使用该解决方案的string output = new string(input.Where(c => char.IsLetter(c) || char.IsDigit(c)).ToArray());一部分,但也包括在|| char.IsPunctuation(c)后ISDIGIT会得到你想要的结果。

+0

立即尝试。 – tnw

+0

不幸的是,这也不工作。 – tnw

+0

你也试过IsLetter ||吗该帖子中的IsDigit可选解决方案? –

6

首先我会检查你的区域设置,以消除任何东西一样简单预期小数点分隔的差异。

如果画一个空白,然后如果字符串10.00解析成功,然后一个字符串,看起来像10.00其无法解析不能真正10.00

检查并确定字符串中每个字符的字符代码,并确认它确实是10.00,而不是一些具有相同外观但实际上不同的奇特Unicode(它们可能还包括当显示)。

+0

区域设置很好。它看起来像一开始就有一个空字符。 'input.Replace(“\ 0”,string.Empty);'也不起作用。 – tnw

0

我会只更换一个存在问题的字符,这是最安全的选择:

s = s.Replace("\u200E", "");