c# float.Parse / float.TryParse 的一個坑

現象

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));
        }
    }
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章