首页 > 解决方案 > 从字符串解析为浮点数时如何修复统一FormatException?

问题描述

我有文本文件(显示为 timeFile TextAsset)。在这个文件中,我有字符串数组,带有浮点元素,每行一个。例子:

7.9483900
8.392342
1.034224
0.032424323
23.563646346

所以我是拆分(\n),每个行元素都有一个浮点元素。我有浮点数组,带有解析的行。

但后来我尝试用这个浮点数组的 y 位置实例化我的预制件,我有:

FormatException:输入字符串的格式不正确。System.Number.ParseSingle(System.String 值,System.Globalization.NumberStyles 选项,System.Globalization.NumberFormatInfo numfmt)(在:0)

如何解决?

void Start()
{
    var lines = timeFile.text.Split("\n"[0]);
    var linesFloat = new float[lines.Length];

    for (int i=0; i<lines.Length; i++)
    {
        linesFloat[i] = float.Parse(lines[i], CultureInfo.InvariantCulture);
    }

    for (int i = 0; i<lines.Length; i++)
    {
        var position = new Vector3(0, linesFloat[i], -0.5f);
        Instantiate(projectilePrefab, position, Quaternion.Euler(0,0,0));
    }
}

我尝试CultureInfo.InvarianCulture了 float Parse,但这对我没有帮助。

标签: c#arraysstringparsingunity3d

解决方案


重新检查您的输入字符串!

它们可能/很可能仍然包含一个\r字符,因为 windows (clrf) 换行符是\r\n或者可能也是一个空格字符。

您可以使用Trim()以确保它们被排除在外,例如

for (int i=0; i<lines.Length; i++)
{
    linesFloat[i] = float.Parse(lines[i].Trim('\r', ' '), CultureInfo.InvariantCulture);
}

如果您只想摆脱可以使用的异常TryParse

for (int i=0; i<lines.Length; i++)
{
    if(float.TryParse(lines[i], out var floatValue))
    {
        linesFloat[i] = floatValue;
    }
    else
    {
        Debug.LogFormat(this, "Oops value {0} could not be parsed!", lines[i]);
    }
}

另请注意,您可以简单地使用

var lines = timeFile.text.Split('\n');

如果只有一个字符


推荐阅读