首页 > 解决方案 > .NET 4.x 与 .NET 3.5 相比更改了小数点 - 如何解决?(统一)

问题描述

所以我开始自下而上地重新制作我的 Unity 项目,将“脚本运行时版本”设置更改为“.NET 4.x 等效”。然后我注意到我的“float.Parse”从字符串中删除了小数点(点)(反之亦然)。

例子:

string s1 = "10.2";
string s2 = "20,2";
Debug.Log("TEST PARSE 1: "+float.Parse(s1));
Debug.Log("TEST PARSE 2: "+float.Parse(s2));

.NET 3.5 返回:

“测试解析 1:10.2”

“测试分析​​ 2:202”

.NET 4.x 返回:

“测试解析 1:102”

“测试分析​​ 2:20,2”

现在,这对我来说是一个相当大的问题,因为 .NET 版本是唯一改变的东西(我可以有两个正在运行的项目同时给出不同的结果) - 所以它不依赖于我的其他计算机或 Unity 设置(除非更改此版本会在 Unity 的其他地方进行一些偷偷摸摸的更改而不通知我)。鉴于此,我如何重现 .NET 4.x 中的第一个变体?

编辑

这是一个解决方案(发布的是正确的,但这将专门针对 Unity 解决):在某些脚本中,只需传递以下内容:

using UnityEngine;
using UnityEditor;
using System.Threading;
 
[InitializeOnLoad]
public class Startup {
    static Startup() {
        Thread.CurrentThread.CurrentCulture = new System.Globalization.CultureInfo("en-us");
    }
}

来源:https ://forum.unity.com/threads/editor-is-using-windows-locale-settings.442847/

标签: c#.netunity3d

解决方案


您看到的行为可能是因为在某些文化集中,,使用的是小数而不是.小数。

例如,如果您当前的文化设置是,en-US并且您执行以下语句:

float.Parse("20,2", System.Globalization.NumberStyles.Float)

你会抛出一个 FormatException。如果你交换你会Float得到Any你想要的结果202

float.Parse("20,20", System.Globalization.NumberStyles.Any) //2020

ed:.NET 的早期版本比 .NET 4.x 做出了更慷慨的意图假设,这就是您看到观察到的行为的原因。

ed 2:更具体地说,.NET 3.5 默认单参数重载float.Parseto NumberStyles.AllowThousands(或类似的组合)。这可以允许开发人员引入由文化设置和解析可能不明确的字符串导致的细微缺陷,如下所示:

10,000 <--- is it 10 thousand, 10 point 000, etc?


推荐阅读