是否可以使用Kleene Operator for Flex Formatters?

时间:2012-08-15 12:02:25

标签: flex flex4


是否可以使用Kleene运算符(Kleene Star)作为格式化程序?
我想使用phoneFormatter,它在第5个数字之后加一个减号,然后它应该可以有一个可变数量的数字。
例如:0172-555666999,0160-44552等
这就是我的开始,但我不知道在最后一个哈希之后属于哪个角色(它不是星星,我已经尝试过了;-)):

<fx:Declarations>
        <mx:PhoneFormatter id="mPhoneFormat"
                           formatString="####-#"/>

    </fx:Declarations>

1 个答案:

答案 0 :(得分:0)

默认PhoneFormatter要求输入字符串与格式字符串具有相同的字符数。它们不支持正则表达式模式(如*匹配元素零次或多次)。

但是,制作自己的格式化程序非常容易。为此,我扩展了PhoneFormatter类并覆盖了其format()方法。我复制并粘贴了原始format()方法并进行了以下修改:

  • 注释掉将源字符串的长度与格式字符串的长度进行比较的代码
  • 比较格式化字符串的长度。如果原始字符串较长,请将原始字符串中的其余字符附加到格式化字符串。

这可能无法处理您的所有用例,但根据您的需要修改它应该非常简单。

package
{
    import mx.formatters.PhoneFormatter;
    import mx.formatters.SwitchSymbolFormatter;

    public class CustomPhoneNumberFormatter extends PhoneFormatter
    {
        public function CustomPhoneNumberFormatter()
        {
            super();
        }

        override public function format(value:Object):String
        {
            // Reset any previous errors.
            if (error)
                error = null;

            // --value--

            if (!value || String(value).length == 0 || isNaN(Number(value)))
            {
                error = defaultInvalidValueError;
                return "";
            }

            // --length--

            var fStrLen:int = 0;
            var letter:String;
            var n:int;
            var i:int;

            n = formatString.length;
            for (i = 0; i < n; i++)
            {
                letter = formatString.charAt(i);
                if (letter == "#")
                {
                    fStrLen++;
                }
                else if (validPatternChars.indexOf(letter) == -1)
                {
                    error = defaultInvalidFormatError;
                    return "";
                }
            }

//          if (String(value).length != fStrLen)
//          {
//              error = defaultInvalidValueError;
//              return "";
//          }

            // --format--

            var fStr:String = formatString;

            if (fStrLen == 7 && areaCode != -1)
            {
                var aCodeLen:int = 0;
                n = areaCodeFormat.length;
                for (i = 0; i < n; i++)
                {
                    if (areaCodeFormat.charAt(i) == "#")
                        aCodeLen++;
                }
                if (aCodeLen == 3 && String(areaCode).length == 3)
                {
                    fStr = String(areaCodeFormat).concat(fStr);
                    value = String(areaCode).concat(value);
                }
            }

            var dataFormatter:SwitchSymbolFormatter = new SwitchSymbolFormatter();
            var source:String = String(value);
            var returnValue:String = dataFormatter.formatValue(fStr, value);
            if (source.length > returnValue.length)
            {
                returnValue = returnValue + source.substr(returnValue.length-1);
            }
            return returnValue;
        }
    }
}