的截图总结了问题:Double.Parse失败为“10.00”检索到的值
我在检索到的值没有控制权。它带有一些我无法弄清楚的时髦格式,即使看起来完全正常,解析也失败了。在手动输入值工作得很好。
我如何“正常化”的检索值,因此Decimal.Parse
不会失败?
仅供参考,这里是未通过字符串(复制和粘贴):
“10.00”
的截图总结了问题:Double.Parse失败为“10.00”检索到的值
我在检索到的值没有控制权。它带有一些我无法弄清楚的时髦格式,即使看起来完全正常,解析也失败了。在手动输入值工作得很好。
我如何“正常化”的检索值,因此Decimal.Parse
不会失败?
仅供参考,这里是未通过字符串(复制和粘贴):
“10.00”
你可能有某种特殊字符隐藏您检索字符串中的。
试试这个:
Double.Parse(Regex.Replace(decimalValue, @"[^0-9.,]+", ""))
您可能需要使用语句添加为System.Text.RegularExpressions
这工作!谢谢。工作示例:https://dotnetfiddle.net/M1cFWi – tnw
不客气。我忘了提及我正在使用这个只会得到正值的变量。如果您也要接收负值,请将您的正则表达式更改为@“[^ 0-9。,] + - ”(注意添加 - ) –
@“[^ 0-9。,] + - ”是废话,无论如何,整个方法不是一个好主意。它将AW57等非数字字符串转换为数字(57)并将数字转换为不同的数字(如1E7转换为17)。它以相当不可预测的方式改变输入,使得整个程序不可靠。 –
如的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会得到你想要的结果。
首先我会检查你的区域设置,以消除任何东西一样简单预期小数点分隔的差异。
如果画一个空白,然后如果字符串10.00
解析成功,然后一个字符串,看起来像但10.00
其无法解析不能真正是10.00
。
检查并确定字符串中每个字符的字符代码,并确认它确实是10.00
,而不是一些具有相同外观但实际上不同的奇特Unicode(它们可能还包括当显示)。
区域设置很好。它看起来像一开始就有一个空字符。 'input.Replace(“\ 0”,string.Empty);'也不起作用。 – tnw
我会只更换一个存在问题的字符,这是最安全的选择:
s = s.Replace("\u200E", "");
该不该无法解析 – Rahul
哪种文化是你的机器? –
从PowerShell:'“10.00”.Length'返回'6'。那么,是否会有某种隐藏的角色?当然是。你的字符串以['U + 200E LEFT-TO-RIGHT MARK'(http://www.fileformat.info/info/unicode/char/200e/index.htm)。如果您的用户应该能够进入,那么可能需要某种标准化。 –