2011-07-13 15 views
1

Flex-AdvancedDataGridに非常に小さな値(コンデンサ)を表示する必要があります spark.formatters.NumberFormatterを使用します。 fractionalDigitsに3,6,9を使用すると、すべて問題ありません。spark.formatters.NumberFormatterを使用して区切り文字の後に9桁を超えないようにしますか?

しかし、12桁を使用する場合、小数点記号の後に12桁が必要なため、9桁の後に値が切り捨てられます。

セパレータの後に9桁以上の数字を入力する方法はありますか?

または "4.7 E-12" のような書式設定を使用する方法があります(E-15というように、E-12、E-9である必要があります)

+1

あなたは)number.toPrecision()またはnumber.toExponential(見たことがありますか? – Ryan

+0

基礎となるフィールドはどのデータ型ですか?私。これは書式の問題ではなく、範囲/精度の問題ですか? – GalacticCowboy

+0

値が9桁後に途切れることは確かですか?おそらくラベルは12桁に収まるほど広くはないでしょうし、それは残りの部分を切り捨てているでしょうか? –

答えて

1

toPrecisionとtoFixedは20桁まで正常に動作します。それは十分です。 4.7 E-12のような結果を得るために、このベースに関数を書くつもりです。助けのための

おかげ 月

0

私はあなたが指定することができますa custom pattern formatter classを作成どのような記号や構造を使用して書式設定された文字列/数値をどのようにしたいかを指定します。要件に応じて、これはあなたを助けるかもしれません。必要に応じてこのクラスを自由に変更してください。

CustomPatternFormatter.as

package 
{ 
    import mx.formatters.Formatter; 

    public class CustomPatternFormatter extends Formatter 
    { 
     private static const VALID_PATTERN_CHARACTERS:String = "#,.-"; 

     // Use # as a placeholder for a regular 
     // character in the input string. 
     // Then add other characters between the 
     // # symbol for the desired output format. 
     // ex. The pattern ##,##,##.## with input 12345678 
     // will output 12,34,56.78 
     public var formatPattern:String; 

     // If True, the input string must match the number 
     // of # characters in the formatPattern. 
     public var inputMustMatchPatternLength:Boolean; 

     //Constructor 
     public function CustomPatternFormatter() 
     { 
      super(); 
      formatPattern = ""; 
      inputMustMatchPatternLength = false; 
     } 

     // Override format(). 
     override public function format(value:Object):String 
     { 
      // Reset error if it exists. 
      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 = "Cannot convert an empty value"; 
       return ""; 
      } 

      // Check to see if the input value must match the format pattern 
      if (inputMustMatchPatternLength && String(value).length != countOccurrences(formatPattern, "#")) 
      { 
       error = "The input value length does not match the format pattern length."; 
       return ""; 
      } 

      // 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 = formatPattern.length; 
      for (i = 0; i < n; i++) 
      { 
       letter = formatPattern.charAt(i); 
       if (letter == "#") 
       { 
        fStrLen++; 
       } 
       else if (VALID_PATTERN_CHARACTERS.indexOf(letter) == -1) 
       { 
        error = "You can only use the following symbols in the formatPattern: " + VALID_PATTERN_CHARACTERS; 
        return ""; 
       } 
      } 

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

      // Format the string 
      for (v = 0; v < vStr.length; v++)   {     if (fArr.length > 0) 
       { 
        do 
        { 
         fChar = fArr.shift(); 

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

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

       returnString += vStr.charAt(v); 
      } 

      // Return the formatted string 
      return returnString.split("").reverse().join(""); 
     } 

     protected function countOccurrences(str:String, char:String):int 
     { 
      var count:int = 0; 
      for (var i:int=0; i < str.length; i++) 
      { 
       if (str.charAt(i) == char) 
       { 
        count++; 
       } 
      } 
      return count; 
     } 
    } 
} 
+0

これは、文字列をフォーマットするためにinterrestingです。しかし、数字を文字列に変換する必要があります。 AdvancedDataGridでは1e-9が表示されますが、0.000000001が必要です。 1e-9の場合、これはOKですが、1e-12は9小数点以下を切り捨てます! –

+0

@Jan Meyerこのクラスは、送信するデータ型を自動的に文字列に変換します。 1e-12のような値に基づいてフォーマットパターンを自動的に作成するメソッドを追加する場合は、それほど難しくないと思います。 –

関連する問題