欢迎您访问 最编程 本站为您分享编程语言代码,编程技术文章!
您现在的位置是: 首页

避免落入c#float.Parse / float.TryParse的陷阱

最编程 2024-08-11 21:24:49
...

现象

c# 在 parse 字符串数字时,会根据当前语言环境决定最终结果。Unity 应用也是如此。

例如下面这个例子,在德语环境下,最终的结果放大了 1000 倍。

类似的还有西班牙语,在这些语言中,小数点并不是中文或者英语里的小数点,而是当作分隔符使用。

using System;
using System.Threading;
using System.Globalization;

namespace bible
{
    class Program
    {
        static void Main(string[] args)
        {
            // 假设当前语言环境为 de-DE
            Console.WriteLine(float.Parse("0.123")); // 123
        }
    }
}

解决方法

将当前语言环境设置为 CultureInfo.InvariantCulture。

using System;
using System.Threading;
using System.Globalization;

namespace bible
{
    class Program
    {
        static void Main(string[] args)
        {
            Thread.CurrentThread.CurrentCulture = CultureInfo.InvariantCulture;
            Thread.CurrentThread.CurrentUICulture = CultureInfo.InvariantCulture;
            Console.WriteLine(float.Parse("0.123"));
        }
    }
}

或者在调用 float.Parse 时设置好语言环境。

using System;
using System.Threading;
using System.Globalization;

namespace bible
{
    class Program
    {
        static void Main(string[] args)
        {
            Console.WriteLine(float.Parse("0.123", CultureInfo.InvariantCulture));
        }
    }
}