2011-06-28 14 views
2

actionscriptのパラメータの1つとしてパターンを与えた数値の書式設定を行うメソッドを記述する必要があります。例えばパターンをパラメータとして受け入れるFlex/ActionscriptのNumberFormatter

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

は当初、私はそれを行うことができて、NumberFormatterが、しかしdocumentationを読んだ後、あなたがパターンを受け入れることができないようだと思いました。

これを実装する方法はありますか?私はFlexを使用しています。

更新:Jasonが作成したサンプルに基づいて高度なフォーマッタを作成しました。あなたはここでそれをダウンロードすることができます。link

答えて

1

UPDATE: ビットの後このカスタムフォーマッタクラスについてもっと考えてみると、私はそれを少し更新することに決めました。 the updated CustomPatternFormatter class hereが表示されます。

更新クラスが追加されます。

  • 任意の文字列だけでなく、数値を渡すことができます。
  • 入力文字列の長さがフォーマットパターンの長さと一致するようにするフラグ。

私はこれが助けてくれることを願っています!

オリジナルの答え:

あなたがこれを処理するためのカスタムフォーマッタを作成する必要があります。ここに私は本当に速く一緒に投げたものです。あなたの状況に合わせて調整する必要があるかもしれません。私は主に番号と通貨を変換する必要があり

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

PhoneFormatterをあなたが求めているものに近いものを持っているようだ:

タグはその スーパークラスのタグ属性の すべてを継承し、次を追加します属性 タグ:

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

だから多分あなたはそれを管理することができます。

この質問は、関連すると思われる:Flex Number Formatそれはあなたが上記のフォーマットを達成する方法を示していますように、とはいえないフォーマット文字列で(本当に厳格な要件である?)

+0

。 – Rudy

+1

私はPhoneFormatterを見て、独自のパターンベースのフォーマッタを実装して、NumberまたはCurrencyFormatterをプロセス内に拡張します。個人的には、##、##、##。##のようなフォーマットの必要性を見たことがないので、Flex SDKでは表示されません。通常のNumber and Currencyフォーマッタは、すべてのケースの99.9%、特に新しいFlex 4.5ロケールベースのフォーマッタで動作します。 –

関連する問題