NumberFormatter во Flex / Actionscript, который принимает шаблон в качестве параметра - PullRequest
2 голосов
/ 28 июня 2011

Мне нужно написать метод, выполняющий форматирование числового значения с учетом шаблона в качестве одного из параметров в actionscript.

Например:

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

Изначально я думал, что NumberFormatter может это сделать, но после прочтения документации кажется, что вы не можете принять шаблон.

Есть идеи, как это реализовать?Я использую Flex 4.1

ОБНОВЛЕНИЕ: я сделал расширенный форматер на основе образца, созданного Джейсоном.Вы можете скачать его здесь: ссылка

Ответы [ 2 ]

1 голос
/ 28 июня 2011

ОБНОВЛЕНИЕ: Подумав немного над этим пользовательским классом форматирования, я решил немного его обновить.Вы можете увидеть обновленный класс CustomPatternFormatter здесь .

Обновленный класс добавляет:

  • Возможность передавать любую строку, а не только числовые значения.
  • Флаг, гарантирующий, что длина входной строки соответствует длине шаблона формата.

Надеюсь, это поможет!

Оригинальный ответ:

Вам придется создать собственный 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("");
            }
        }
}
1 голос
/ 28 июня 2011

В PhoneFormatter , похоже, есть что-то близкое к тому, что вы просите:

Тег наследует все атрибуты тега своего суперкласса и добавляет следующий тегАтрибуты:

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

Так что, возможно, вы справитесь с этим.

Этот вопрос также представляется актуальным: Формат чисел Flex , поскольку он демонстрирует, как достичьформат, который вы упомянули выше, хотя и не с форматной строкой (это действительно строгое требование?)

...