1


フォーマッターにクリーネ閉包(クリーネ閉包)を使用することは可能ですか?
5番目の数字の後にマイナスを付けるphoneFormatterを使用したいのですが、その後は可変数の数字を使用できるようになります。
例:0172-555666999、0160-44552など。

これが私が始めた方法ですが、最後のハッシュの後にどの文字が属しているかわかりません(星ではないので、すでに試しました;-)):

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

    </fx:Declarations>
4

1 に答える 1

0

デフォルトでPhoneFormatterは、入力文字列はフォーマット文字列と同じ文字数であると想定されています。これらは正規表現パターンをサポートしていません(要素を0回以上一致させる*など)。

ただし、独自のフォーマッタを作成するのは非常に簡単です。これを行うために、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 に答える