无法在 Unity2D 中将输入字符串解析为整数

问题描述 投票:0回答:3

我正在统一制作一个小游戏,需要玩家输入进行小计算。 但是输入的数字是字符串格式,需要转换成整数进行计算。我正在使用 Unity 输入字段和 TextMesh Pro 进行玩家输入。

这是单击“计算”按钮后执行的方法。

CalcObjects
数组包含来自输入字段的 TextMeshProUGUI's。第二个指数计算后的答案。

public void Calculate()
    {
        string answer = "";

        string velocity = CalcObjects[0].text;
        Debug.Log(Convert.ToInt32(velocity.Trim()));

        CalcObjects[2].text = answer;
    }

报错信息是:

FormatException: Input string was not in a correct format.

关于如何解决这个问题的任何想法?

c# unity3d
3个回答
1
投票

找到答案了,不得不承认是我偷懒了

  1. 我试图直接编辑输入字段的“文本”组件,而不是使用

    TextMeshProUGUI's
    我应该使用
    TMP_InputField
    变量。

  2. 按照@derHugo的建议将内容类型设置为

    IntegerNumber
    ,然后使用以下代码:

public void Calculate()
    {
        int answerInt = 0;

        answerInt = Convert.ToInt32(CalcObjects[0].text) / Convert.ToInt32(CalcObjects[1].text);
        Debug.Log(answerInt);
    }

谢谢你们帮助我,正如你们所说,我更像是一个初学者。


0
投票

不管你在收到错误时传入的字符串到底是什么,我宁愿使用

Int32.TryParse
来捕获无效输入

public void Calculate()
{
    var answer = "";

    var velocity = CalcObjects[0].text.Trim();

    if(Int32.TryParse(velocity, out var intValue))
    {
        Debug.Log(intValue);
        CalcObjects[2].text = answer;
    }   
    else
    {
        Debug.LogWarning($"Invalid input: \"{velocity}\"");
        CalcObjects[2].text = "";
    }
}

顺便说一句,您可以通过为您的输入字段设置特定的

contentType
来进一步避免任何错误:

private void Awake()
{
    CalcObjects[0].contentType = ContentType.IntegerNumber;
}

所以用户甚至不能插入任何不是整数值的东西


0
投票

刚刚遇到这个问题玩了几个小时,结果是 TMPro 插入了空白字符,无论您是否尝试 Int32.TryParse,它总是会返回一个无效的转换。

解决方案是遍历您的字符串并丢弃无效数字的字符。

这个函数对我有用,但它假设数字是正数,并忽略格式、逗号等。使用风险自负,但它让我摆脱了麻烦!

    public static int IntParseFast(string value)
{
    int result = 0;
    for (int i = 0; i < value.Length; i++)
    {
        char letter = value[i];
        if (letter > 47 && letter < 58) { result = 10 * result + (letter - 48); }
    }
    return result;
}
© www.soinside.com 2019 - 2024. All rights reserved.