将TextField限制为像数字步进器一样

时间:2010-12-02 05:32:28

标签: regex flex flash actionscript-3 textfield

我正在从头开始制作数字步进器,所以我希望我的文本字段以这种格式仅接受数字:xx.x,x.x,x或xx,其中x是数字。例如: 可接受的数字: 1 22 15.5 3.5

无可接受的数字: 213 33.15 4332 1.65

也许这会有所帮助: http://livedocs.adobe.com/flash/9.0/ActionScriptLangRefV3/flash/text/TextField.html#restrict

这是我到目前为止所得到的:

var tx:TextField = new TextField();
tx.restrict="0-9."; //Maybe there is a regular expression string for this?
tx.type=TextFieldType.INPUT;
tx.border=true;

你可以在flash中复制它,它应该可以工作。

非常感谢你的帮助,先生。

2 个答案:

答案 0 :(得分:1)

非常类似于TheDarklins的回答,但更优雅一点。实际上渲染_tf.restrict已经过时,但我仍然建议使用它。

_tf.addEventListener(TextEvent.TEXT_INPUT, _onTextInput_validate);

这两个事件监听器都以相同的方式执行 EXACT 相同的功能。对于那些喜欢较小代码的人来说,一行写成一行。另一个是那些喜欢看逐行的人。

private function _onTextInput_validate(__e:TextEvent):void
{
    if ( !/^\d{1,2}(?:\.(?:\d)?)?$/.test(TextField(__e.currentTarget).text.substring(0, TextField(__e.currentTarget).selectionBeginIndex) + __e.text + TextField(__e.currentTarget).text.substring(TextField(__e.currentTarget).selectionEndIndex)) ) __e.preventDefault();
}

了解事件监听器的更详细版本

private function _onTextInput_validate(__e:TextEvent):void
{
    var __reg:RegExp;
    var __tf:TextField;
    var __text:String;

    // set the textfield thats causing the event.
    __tf = TextField(__e.currentTarget);

    // Set the regular expression.
    __reg = new RegExp("\\d{1,2}(?:\\.(?:\\d)?)?$"); 
    // or depending on how you like to write it.
    __reg = /^\d{1,2}(?:\.(?:\d)?)?$/;

    // Set all text before the selection.
    __text = __tf.text.substring(0, __tf.selectionBeginIndex);
    // Set the text entered.
    __text += __e.text;
    // Set the text After the selection, since the entered text will replace any selected text that may be entered
    __text += __tf.text.substring(__tf.selectionEndIndex);

    // If test fails, prevent default
    if ( !__reg.test(__text) )
    {
        __e.preventDefault();
    }
}

我必须允许xx.作为有效响应,否则您需要输入123然后返回空格并输入。为12.3。那绝不是好事。所以12.现在在技术上是有效的。

答案 1 :(得分:0)

package
{
import flash.display.Sprite;
import flash.text.TextField;
import flash.text.TextFieldType;
import flash.events.TextEvent;

public class DecimalPlaces extends Sprite
    {
    public function DecimalPlaces()
        {
        var tf:TextField = new TextField();
        tf.type = TextFieldType.INPUT;
        tf.border = true;
        tf.width = 200;
        tf.height = 16;
        tf.x = tf.y = 20;
        tf.restrict = ".0-9"
        tf.addEventListener(TextEvent.TEXT_INPUT, restrictDecimalPlaces);

        addChild(tf);
        }

    function restrictDecimalPlaces(evt:TextEvent):void
        {
        var matches:Array = evt.currentTarget.text.match(/\./g);
        var allowedDecimalPlaces:uint = 1;

        if  ((evt.text == "." && matches.length >= 1) ||
            (matches.length == 1 && (evt.currentTarget.text.lastIndexOf(".") + allowedDecimalPlaces < evt.currentTarget.text.length)))
            evt.preventDefault();
        }
    }
}