【问题标题】:How to display a number with varying decimal separator in Flex如何在 Flex 中显示具有不同小数分隔符的数字
【发布时间】:2013-01-10 22:41:41
【问题描述】:

按照此处的说明更改我的操作系统的小数分隔符后: (http://blogmines.com/blog/2010/03/11/how-to-change-the-decimal-separator-in-excel-2010/),我想在 Flex 中显示一个数字,它使用逗号作为千位分隔符和小数点分隔符。听起来很简单,对吧?

我尝试使用 Flex 提供的三种不同的 NumberFormatter。一路走来,我了解到它们中的两个在同一个类中与其他类玩得不好,即使在声明变量时使用完全限定的类路径,所以我不得不将它们分成三个类,如下所示:

NF1 - spark.formatters.NumberFormatter

package dstrube
{
    import flash.globalization.NumberParseResult;
    import spark.formatters.NumberFormatter;
    public class NF1
    {
        public static function get(value:String):String{
            var nf1:NumberFormatter = new NumberFormatter();
            var result:NumberParseResult = nf1.parse(value);
            return nf1.format(result.value);
        }
    }
}

NF2 - flash.globalization.NumberFormatter

package dstrube
{
    import flash.globalization.NumberParseResult;
import flash.globalization.NumberFormatter;
    public class NF2
    {
        public static function get(value:String):String{
            var nf2:NumberFormatter = new NumberFormatter("");// LocaleID.DEFAULT = same outcome as without
            nf2.fractionalDigits = 2; //= same outcome as without
            nf2.trailingZeros = true;
            var result:NumberParseResult = nf2.parse(value);
            //nf2.parseNumber(value); = NaN
            return nf2.formatNumber(result.value)
        }
    }
}

NF3 - mx.formatters.NumberFormatter(已弃用)

package dstrube
{
    //import mx.formatters.NumberBaseRoundType;
    import mx.formatters.NumberFormatter;
    public class NF3
    {
    public static function get(value:String):String{
        var nf3:NumberFormatter = new NumberFormatter();
        //nf3.rounding = NumberBaseRoundType.NEAREST; //no effect in this case
        return nf3.format(value);
    }
}

}

最后是主要的

<?xml version="1.0" encoding="utf-8"?>
<s:Application xmlns:fx="http://ns.adobe.com/mxml/2009" 
               xmlns:s="library://ns.adobe.com/flex/spark" 
               xmlns:mx="library://ns.adobe.com/flex/mx" minWidth="955" minHeight="600"
               creationComplete="init()"
               >
    <fx:Script>
        <![CDATA[
            import dstrube.NF1;
            import dstrube.NF2;
            import dstrube.NF3;
            [Bindable]
            public var s:String = "";
            protected  function init():void{
                var value:String = "5558049.90360013";
                s = "spark.formatters.NumberFormatter = " + NF1.get(value); //5,558,049.90
                s += "\n flash.globalization.NumberFormatter = " + NF2.get(value);//5,558,049,00
                s += "\n mx.formatters.NumberFormatter = " + NF3.get(value); //5,558,049.90360013
            }
        ]]>
    </fx:Script>
        <s:TextArea id="textArea" text="{s}" width="100%" height="100%" />
</s:Application>

三个 NumberFormatter 中最聪明的是用于识别小数分隔符的 flash.globalization.NumberFormatter,但它舍入不正确,显示 5,558,049,00 而不是 5,558,049,90

有什么想法吗?

【问题讨论】:

    标签: apache-flex numberformatter


    【解决方案1】:

    您可以:

    • 显式设置格式化程序的属性将为您提供 您需要的输出。
    • 将格式化程序设置为使用默认语言环境。

              [Bindable] protected var formatted:String;
      
              protected function init(event:FlexEvent):void
              {
                  var formatter:NumberFormatter = new NumberFormatter();
      
                  // Option 1 set explicitly
                  formatter.decimalSeparator = ",";
                  formatter.fractionalDigits = 2;
                  formatter.trailingZeros = true;
      
                  // Option 2 set default locale to be the locale
                  formatter.setStyle("locale", LocaleID.DEFAULT);
      
                  formatted = formatter.format("5558049.90360013");
              }
      
          ]]>
      </fx:Script>
      
      <s:Label text="{formatted}" />
      

    输出为“5,558,049,90”。

    【讨论】:

    • 嗯,这很有帮助,但不是我想要的。我正在寻找一种方法来做到这一点,而不必在 flex 中指定小数点分隔符,而是检测操作系统的小数点分隔符。 flash.globalization.NumberFormatter 似乎是唯一这样做的,但有奇怪的舍入错误。我注意到在 spark.formatters.NumberFormatter 中,当我在区域和语言中选择了“英语(美国)”时,有一个名为 actualLocaleIDName 的属性是“en-us”;但如果我将其更改为“French (Belgium”) 之类的其他名称,actualLocaleIDName 不会改变。
    • 啊哈!我想通了:由于 flash.globalization.NumberFormatter 可以检测到操作系统的 decimalSeparator 但舍入不良,并且由于 spark.formatters.NumberFormatter 具有良好的舍入但无法检测到操作系统的 decimalSeparator,因此解决方案是使用 spark 格式化程序但将其设置为flash.globalization 中的小数分隔符。我会立即发布解决方案。
    • 但是,我没有在原始问题中明确指定这必须使用操作系统设置中的小数分隔符,您的示例帮助我找到了答案,所以我会说你赢了赏金。谢谢你的帮助,贾斯汀。
    • spark.formatters.NumberFormatter 在后台使用 flash.globalization.NumberFormatter 并且在大多数情况下应该获取当前区域设置的小数分隔符。但是我注意到在 OSX 上它并不总是正确的。在我的例子中,GlobilizationBase 中的 localeChanged 被调用,并且语言环境被设置为“en”,而不是我所期望的“en-AU”。 Flash 将“en”表示为“en-US”,并在 NumberFormatter 的 createWorkingInstance 中将 g11nWorkingInstance 更改为使用“en-US”。
    • 这也可能是一个答案:formatter.setStyle("locale", LocaleID.DEFAULT);格式化 = formatter.format("5558049.90360013");
    【解决方案2】:

    这种方式将显示操作系统设置中设置的任何小数点分隔符。

    <?xml version="1.0" encoding="utf-8"?>
    <s:Application xmlns:fx="http://ns.adobe.com/mxml/2009" 
                   xmlns:s="library://ns.adobe.com/flex/spark" 
                   xmlns:mx="library://ns.adobe.com/flex/mx"
                   initialize="init(event)">
        <fx:Script>
            <![CDATA[
                import mx.events.FlexEvent;
                import spark.formatters.NumberFormatter;
                import flash.globalization.NumberFormatter;
    
                [Bindable] protected var formatted:String;
    
                protected function init(event:FlexEvent):void
                {
                    var formatter:spark.formatters.NumberFormatter = new spark.formatters.NumberFormatter();
                    var nf2:flash.globalization.NumberFormatter = new flash.globalization.NumberFormatter("");
    
                    formatter.decimalSeparator = nf2.decimalSeparator;
                    formatter.fractionalDigits = 2;
                    formatter.trailingZeros = true;
    
                    formatted = formatter.format("5558049.90360013");
                }
    
            ]]>
        </fx:Script>
    
        <s:Label text="{formatted}" />
    </s:Application>
    

    【讨论】:

      猜你喜欢
      • 2023-04-05
      • 1970-01-01
      • 2016-02-06
      • 2018-05-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多