c# - Int32.Parse 与 Single.Parse - ("1,234") 和 ("1,2,3,4")。为什么 int 和浮点类型以不同方式解析分隔符?

标签 c# .net parsing floating-point int

在 C# 中:

这会抛出一个 FormatException,这似乎不应该:

Int32.Parse("1,234");

这不是,这看起来很正常:

Single.Parse("1,234");

令人惊讶的是,这解析得很好:

Single.Parse("1,2,3,4"); //Returns 1234

我的本​​地文化是 EN-US,所以 , 是默认的千位分隔符。

主要问题:为什么不一致?

另外:为什么 Parse("1,2,3,4") 有效?它似乎只是在解析之前删除了本地分隔符 char 的所有实例。我知道在正则表达式检查或类似的东西中会有额外的运行时开销,但是数字文字“1,2,3,4”什么时候不是拼写错误?


相关: C# Decimal.Parse issue with commas

最佳答案

根据 MSDN :

The s parameter contains a number of the form:

[ws][sign]digits[ws]


The s parameter is interpreted using the NumberStyles.Integer style. In addition to decimal digits, only leading and trailing spaces together with a leading sign are allowed.

就是这样,NumberStyles.Integer 不允许 Parse 方法使用千位分隔符,而 Single.Parse 默认使用 NumberStyles.FloatNumberStyles.AllowThousands。您可以通过将第二个参数指定为 NumberStyles 来更改此行为:

Int32.Parse("1,234", NumberStyles.AllowThousands); //works

Single.Parse 忽略分组并且不使用特定于文化的 NumberGroupSizes ,并且只确定字符是组分隔符还是小数分隔符。组大小仅在格式化数字时使用。

关于c# - Int32.Parse 与 Single.Parse - ("1,234") 和 ("1,2,3,4")。为什么 int 和浮点类型以不同方式解析分隔符?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35751292/

相关文章:

c# - 确定字符串中第一个字符的最有效方法?

c# - 如何将代码从 C# 转换为 PHP

python - 以 UTF-8 格式从 lxml 错误日志中打印消息

parsing - C 中如何解决 typedef-name - 标识符问题?

c# - 如何禁用 DataGridView 中的排序?

c# - 禁用在 Visual Studio 2017 中不起作用的 Azure Functions 属性

java - Visual Studio 浮点/单一操作输出错误

c# - 我如何选择绘制的矩形并在面板中清除它?

javascript - 如何获取剑道上下文菜单中的当前行?

.net - IIS 在不关闭 IIS 网站的情况下发布 ASP.NET Core 应用程序