为什么decimal.Parse(10 10)有效?

use*_*303 2 c# parsing decimal

为什么decimal.Parse(10 10)有效?
在这种情况下我需要得到例外.
请告诉我一些事情.

decimal c;
try
{
   c = decimal.Parse("10 10");
   Console.Write(c);
   Console.ReadLine();
}
catch (Exception)
{
    throw;
}
Run Code Online (Sandbox Code Playgroud)

Jon*_*eet 10

当我运行它时会引发异常 - 这使我怀疑它对文化敏感.

我猜你是在一个将空间用作"千"分隔符的文化中.例如,如果我尝试解析"10,10",因为逗号是我默认文化中的千位分隔符.

为防止这种情况,请使用

decimal value = decimal.Parse(text, NumberStyles.None);
Run Code Online (Sandbox Code Playgroud)

...或其他一些适当的组合NumberStyles排除AllowThousands.


Chr*_*rna 8

来自MSDN:"参数s使用NumberStyles.Number样式进行解释.这意味着允许使用空格和千位分隔符,不允许使用货币符号.要明确定义元素(如货币符号,千位分隔符和空格),可以出现在s中,使用Decimal.Parse(String,NumberStyles)或Decimal.Parse(String,NumberStyles,IFormatProvider)方法."

http://msdn.microsoft.com/en-us/library/cafs243z.aspx

编辑:为了进一步澄清,你需要

  1. 明确地将应用程序的文化设置为不允许数字空格的文化,或者
  2. 显式提供NumberStyles参数,该参数指定不允许空格

编辑2: Jon Skeet的回答是正确的.例如,以下内容不会抛出异常,因为空格在sv-SE中用作千位分隔符:

Decimal.Parse(" 10 10 ", CultureInfo.GetCultureInfo("sv-SE").NumberFormat)
Run Code Online (Sandbox Code Playgroud)

但是,以下内容会抛出异常:

Decimal.Parse(" 10 10 ", CultureInfo.GetCultureInfo("en-US").NumberFormat)
Run Code Online (Sandbox Code Playgroud)