我正在统一制作一个小游戏,需要玩家输入进行小计算。 但是输入的数字是字符串格式,需要转换成整数进行计算。我正在使用 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.
关于如何解决这个问题的任何想法?
找到答案了,不得不承认是我偷懒了
我试图直接编辑输入字段的“文本”组件,而不是使用
TextMeshProUGUI's
我应该使用TMP_InputField
变量。
按照@derHugo的建议将内容类型设置为
IntegerNumber
,然后使用以下代码:
public void Calculate()
{
int answerInt = 0;
answerInt = Convert.ToInt32(CalcObjects[0].text) / Convert.ToInt32(CalcObjects[1].text);
Debug.Log(answerInt);
}
谢谢你们帮助我,正如你们所说,我更像是一个初学者。
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;
}
所以用户甚至不能插入任何不是整数值的东西
刚刚遇到这个问题玩了几个小时,结果是 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;
}