Flex / Actionscript中的NumberFormatter接受模式作为参数

时间:2011-06-28 11:45:25

标签: flex actionscript-3 flex4 formatting

我需要编写一个方法,在actionscript中将模式作为参数之一进行数值格式化。

例如:

a. 12345.00 using format pattern ###,###.## resulting 12,345.00
b. 12345.00 using format pattern ##,##,##.## resulting 1,23,45.00

最初,我认为NumberFormatter能够做到这一点,但在阅读documentation后,您似乎无法接受模式。

知道如何实现这个吗?我正在使用Flex 4.1

更新:我根据杰森创建的样本制作了一个高级格式化程序。您可以在此处下载:link

2 个答案:

答案 0 :(得分:1)

PhoneFormatter似乎与你要求的东西很接近:

  

标签继承   它的所有标签属性   超类,并添加以下标记   属性:

  <mx:PhoneFormatter
    areaCode="-1"
    areaCodeFormat="(###)"
    formatString="(###) ###-####"
    validPatternChars="+()#-. "   />

所以也许你可以用它来管理。

这个问题似乎也很相关:Flex Number Format因为它演示了如何实现上面提到的格式,虽然没有格式字符串(这真的是一个严格的要求吗?)

答案 1 :(得分:1)

<强>更新 在对这个自定义格式化程序类进行了一些思考之后,我决定稍微更新一下。您可以看到the updated CustomPatternFormatter class here

更新的课程添加:

  • 传递任何字符串的能力,而不仅仅是数值。
  • 确保输入字符串长度与格式模式长度匹配的标志。

我希望这有帮助!

原始回答:

您必须创建自定义Formatter来处理此问题。这是我快速拼凑的东西。您可能需要根据自己的情况进行调整。

<强> CustomNumericFormatter.as

package 
{
    // formatters/myFormatter/SimpleFormatter.as
    import mx.formatters.Formatter;
    import mx.formatters.SwitchSymbolFormatter;

        public class CustomNumericFormatter extends Formatter 
        {
            private static const VALID_PATTERN_CHARS:String = "#,.";

            // Declare the variable to hold the pattern string.
            public var formatString:String = "";

            // Constructor
            public function CustomNumericFormatter() {
                // Call base class constructor.
                super();
            }

            // Override format().
            override public function format(value:Object):String {
                if (error)
                    error = null;

                // If value is null, or empty String just return "" 
                // but treat it as an error for consistency.
                // Users will ignore it anyway.
                if (!value || (value is String && value == ""))   
                {
                    error = "0 Length String";
                    return "";
                }

                // -- value --              
                // 1. Validate value - must be a nonzero length string.
                if (!value || String(value).length == 0 || isNaN(Number(value)))
                {
                    error = "Invalid object type passed to formatter";
                    return "";
                }

                // 2. If the value is valid, format the string.
                var fStrLen:int = 0;
                var letter:String;
                var n:int;
                var i:int;
                var v:int;

                // Make sure the formatString is valid.
                n = formatString.length;
                for (i = 0; i < n; i++)
                {
                    letter = formatString.charAt(i);
                    if (letter == "#")
                    {
                        fStrLen++;
                    }
                    else if (VALID_PATTERN_CHARS.indexOf(letter) == -1)
                    {
                        error = "You can only use the following symbols in the formatString: # , .";
                        return "";
                    }
                }

                var returnString:String = "";
                var vStr:String = String(value).replace(".", "").split("").reverse().join("");
                var fStr:Array = formatString.split("").reverse();
                var fChar:String;

                for (v = 0; v < vStr.length; v++)
                {   
                    if (fStr.length > 0)
                    {
                        do 
                        {
                            fChar = fStr.shift();

                            if (fChar != "#")
                                returnString += fChar;

                        } while (fChar != "#" && fStr.length > 0);
                    }


                    returnString += vStr.charAt(v);
                }   

                return returnString.split("").reverse().join("");
            }
        }
}