如何限制TextField
的输入,使其只能包含数学表达式?
接受的输入是:
“3 + 5”
“ - 5 + 6”
“3/2(6 * 4)”
“6--5”
“+ 5-3”
等。
被拒绝的输入将是:
“5 +++ 3”
“6(7)”
“6-6 - + - 7”
等等。
基本上;我希望它被限制的语法是编程语言通常用于评估数学表达式的语法类型,有点像您希望从日常计算器中获得的语法输入。
我正在创建一个程序,我希望用户能够在文本框中输入数字和/或计算,而不必使用计算器来执行此操作,然后艰难地输入一个带有7位小数的数字地方。
我已经看了一下,我看过很多涉及正则表达式,后缀,BNF等的东西。很多看起来非常复杂,对我的理解来说太复杂了,而且没有任何与AS3有任何关系。
但是,我已经想过通过将字符串转换为AS3可以理解的数学表达式来简化这个问题,并让Flash使用try catch
来处理错误,但我不知道我知道如何做到这一点(Number("3+5")
导致NaN
)。
我目前正在使用Event.CHANGE
将文字输入限制为仅数字,如下所示:
function Restrict(event:Event):void
{
if (event.currentTarget.text.indexOf(".") == -1)
{
event.currentTarget.restrict = "0-9.";
}
else
{
event.currentTarget.restrict = "0-9";
}
}
到目前为止它似乎运作良好。
我打算以这种方式实现这一新限制,但如果有更有效的方法来限制文本输入,请随时将其包含在回复中。
为了清楚起见,我要问的是如何实现能够让某人将数学表达式输入TextField
的功能,程序会将该输入作为表达式进行注册并计算出来。
感谢阅读。
编辑:我做了一些研究,我偶然发现了Reverse Polish Notation计算器/解析器/实用程序类/库/ thingy看起来非常有用。看起来有点类似于fsbmain提到的Executer
类,但它看起来更简单易用,让我更容易理解。
然而问题仍然存在,我必须找到一种有效的方法来限制用户输入到数学表达式的语法,但至少现在我至少有两种方法将字符串转换为数字进行计算。 / p>
答案 0 :(得分:1)
实际上这是一个非常棘手的问题,即使您提到的6-6-+-7
的定义本身也很复杂,即表达式as3
从7
语法的角度来看是有效的,并给出了结果{ {1}}。
关于问题的第二部分:
将字符串转换为AS3可以理解的数学表达式
仅仅使用原生as3意味着不可能因为eval
- 类似的函数自as2
时起就消失了,但你可以尝试使用一些as3编写的语法翻译器,即{{3}来自application:ensure_all_started/1,2
项目:
var exec:Executer = new Executer();
var res:* = exec.exec(this, "6-7");
trace("exec = " + res); //output "-1"
虽然你的问题中有一些复杂的表达式失败了:
var exec:Executer = new Executer();
var res:* = exec.exec(this, "6-6-+-7");
trace("exec = " + res); //output "- 7"