1


格式化程序是否可以使用 Kleene 运算符(Kleene Star)?
我想使用phoneFormatter,它在第5个数字之后加上一个减号,之后应该可以有可变数量的数字。
例如:0172-555666999、0160-44552 等。

这就是我开始的方式,但我不知道最后一个哈希之后属于哪个字符(它不是星号,我已经尝试过 ;-)):

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

    </fx:Declarations>
4

1 回答 1

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;
        }
    }
}
于 2012-08-21T02:19:47.803 回答