如何安全、正确地将用户输入的数字转换为双精度

本文关键字:输入 用户 数字 转换 双精度 正确地 何安全 安全 | 更新日期: 2023-09-27 18:19:40

这基本上是一个CultureInfo问题。从形式上讲,在我国,小数分隔符是逗号(,),千分分隔符是点(.)。然而,在实践中,这只适用于会计师和勤奋的人。通常情况下,人们从不使用千位分隔符,他们可以交替使用逗号和句点作为小数分隔符。即使在我从其他人那里收到的一些Excel电子表格中,我也看到了这个问题,Excel没有将点识别为十进制分隔符,将字段格式化为字符串,而不是数字。

到目前为止,我的"解决方案"是简单地用点替换用户输入中的所有逗号,然后用InvariantCulture解析双引号,如下所示:

string userInput;
...
userInput = userInput.Replace(',', '.');
double result;
double.TryParse(userInput, NumberStyles.Float, CultureInfo.InvariantCulture, out result);

当有人真的进入数千分隔符时,这显然会失败,在我看来,这更像是一个破解,而不是一个真正的解决方案。那么,除了制作我自己的替身解析器之外,还有什么更干净的方法来处理这个问题吗?

如何安全、正确地将用户输入的数字转换为双精度

如果您使用的是ASP.Net,您可以使用AjaxControlToolkit FilteredTextBox,也可以使用正则表达式和模式匹配来完成任务。尝试获得标准输入几乎总是比尝试处理每一个可能的人工输入变量要好。

其他一些链接:
掩码文本框
WPF工具过滤文本框

如果有规则可以最终确定它们的含义,那么您就可以对逻辑进行编码。然而,有了这个问题,不可能知道每种情况下的意图:

1,001 === 1.001 or 1001

此外,即使任何"更好"的逻辑都可能假设像"1,01"这样的数字是明确的,但这样的输入可能是"1001"的拼写错误。这种可能性有多大取决于你收集的数据类型。

如果人们很少使用千位分隔符,那么您现有的逻辑似乎很好。然而,如果你想100%确定自己的意图,唯一确定的方法就是问他们在这种情况下是什么意思。例如,如果有人输入1,0011.001,则验证失败,但将其重新编码为"1001.0"(如果处理货币,则为.00)以消除歧义,迫使他们重新进行歧义。

在实践中,这种谨慎可能会弊大于利,因为人们并没有真正使用千分分隔符。我会坚持你所得到的。