デフォルトで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;
}
}
}