C#Double Parsing在不应该提供错误时给出错误

时间:2019-07-19 06:52:16

标签: c# parsing double

我正在从事C#项目。我正在解析datagridview的值并将其格式化,但问题是除1以外的所有值都被完美地解析了。非常有趣,这是我第一次遇到这种情况。

for (int i=0; i<dgKisiFatura.Rows.Count-1; i++)
    for (int j = 3; j < dgKisiFatura.Columns.Count; j++)
    {
        dgKisiFatura.Rows[i].Cells[j].Value = string.Format("{0:n2}",
          Math.Round(double.Parse(dgKisiFatura.Rows[i].Cells[j].Value.ToString()), 2));

        dgKisiFatura.Columns[j].DefaultCellStyle.Font = fontSayi;
    }

问题是它正在解析以下所有值,除了一个240000‬

这些是我设置为DataGridView的确切字符串。

dgKisiFatura.Rows[0].Cells[4].Value =   "4320000";
dgKisiFatura.Rows[1].Cells[4].Value =   "1680000";
dgKisiFatura.Rows[2].Cells[4].Value =    "600000";
dgKisiFatura.Rows[3].Cells[4].Value =    "540000";
dgKisiFatura.Rows[4].Cells[4].Value =    "600000";
dgKisiFatura.Rows[5].Cells[4].Value =   "1800000";
dgKisiFatura.Rows[6].Cells[4].Value =    "240000‬"; // <- Here is the problem
dgKisiFatura.Rows[7].Cells[4].Value =   "1800000";
dgKisiFatura.Rows[8].Cells[4].Value =    "480000";
dgKisiFatura.Rows[9].Cells[4].Value =   "1440000";
dgKisiFatura.Rows[10].Cells[4].Value =   "360000";
dgKisiFatura.Rows[11].Cells[4].Value =   "900000";
dgKisiFatura.Rows[12].Cells[4].Value =   "120000";
dgKisiFatura.Rows[13].Cells[4].Value =  "2160000";
dgKisiFatura.Rows[14].Cells[4].Value =   "900000";
dgKisiFatura.Rows[15].Cells[4].Value = "17940000";

我将所有这些内容放入try and catch块中,除了240000‬之外,它都可以完美解析。

This is the MessageBox that shows where the error happened

如果我使用try / catch,它将通过该值并保持正常运行。 我需要你的帮助。我想念什么吗?

2 个答案:

答案 0 :(得分:2)

与TheGeneral的答案相同,但是表示形式略有不同(使用string s时,字符通常比字节更方便)。让我们看一下字符串的 dump

  using System.Linq;

  ...

  string data = "240000‬"; // Copy + Paste from the question

  string dump = string.Join(Environment.NewLine, 
    data.Select(c => $"'{c}' (\\u{(int)c:x4})"));

  Console.Write(dump);

结果:

'2' (\u0032)
'4' (\u0034)
'0' (\u0030)
'0' (\u0030)
'0' (\u0030)
'0' (\u0030)
'‬' (\u202c)   <- the very reason of misbehavior

我们看到,data不可见 Unicode字符\u202c(POP方向格式化)结尾,这就是为什么data无法解析为double

答案 1 :(得分:1)

"240000‬"的末尾有一个不可打印的怪异字符48 32

您可以通过

更好地查看它
var result = System.Text.Encoding.Unicode.GetBytes("240000‬");

弄清楚为什么会出现这种情况,阻止它发生,您已经解决了问题

Online Demo here