法语操作系统中的隐蔽十进制问题



我正在尝试在我的应用程序中使用以下代码,它仅在法语操作系统中引发异常。 你能帮我解决这个问题吗?

using System.Globalization;
using System.Threading;
....
CultureInfo pro = new CultureInfo(Thread.CurrentThread.CurrentCulture.Name);
SqlCmd.Parameters[Dat.ColumnName].Value = Convert.ToDecimal("0.000001",pro);

这不是法语中的有效小数。在法语中,小数点符号是逗号。

如果字符串始终有一个句点作为小数点符号,则使用当前区域性是没有意义的。最好使用固定区域性:

Convert.ToDecimal("0.000001", CultureInfo.InvariantCulture);

换个说法:

C# 知道using指令,因此不必完全限定所有类型。

无需编写System.Globalization.CultureInfo,只需将using System.Globalization;放在 C# 文件的顶部,并在代码中使用CultureInfo
这使您的代码更具可读性。

在法国文化中,小数不使用点,而是使用逗号。(例如:0,000001)

如果要在法语区域性中解析 0.00001,请指定 CultureInfo.InvariantCulture 以处理点而不是逗号

它与区域性如何指定十进制数字有关。在英语(以及 .net 的固定区域性)中,小数点分隔符是点字符".",但在法语(和大多数欧洲区域性)中,逗号 ","是小数分隔符。

using System.Globalization;
...
decimal d = Convert.ToDecimal("0.000001",CultureInfo.InvariantCulture);
//outputs 0.000001
Console.WriteLine(d); 
CultureInfo french = new CultureInfo("fr");
d = Convert.ToDecimal("0,000001",french);
//outputs 0.000001
Console.WriteLine(d); 
d = Convert.ToDecimal("0.000001",french);
//Throws an "Input string was not in a correct format" exception
//because a . is not a valid character in a decimal, according to french culture

如果通过 UI 从用户处获取值,则需要格外小心他输入数据的区域性,因为很容易将小数点误解为千位分隔符,而不是十 (10.00) 项来节省一千个。

最新更新