我正在处理一个 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 和 catch block 中,除了 240000
之外,它解析得很好。
如果我使用 try/catch 并保持完美运行,它就会传递该值。我需要你的帮助。我错过了什么吗?
与 TheGeneral 的回答中的想法相同,但表示形式略有不同(使用 string
时,字符 通常比字节更方便)。让我们看一下字符串的转储:
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 DIRECTIONAL FORMATTING),这就是为什么 data
不能被解析为 double
我是一名优秀的程序员,十分优秀!