【问题标题】:What would you use to zero pad a number in Flex/AS3?你会用什么来在 Flex/AS3 中将数字填零?
【发布时间】:2010-10-14 13:41:56
【问题描述】:

this 的重复。

在 Flex/AS3 中,您会使用什么来在数字左侧填充零?

是否有等效于 printfNumberFormat 的方法?

我正在寻找最好的实现或类似的东西:

public function zeroPad(number:int, width:int):String {
    // number = 46, width = 4 would return "0046"
}

【问题讨论】:

  • 它确实是重复的,虽然我从未在搜索引擎中找到它,因为它没有谈论零、填充、数字格式,并且标题中的措辞类似于 Ruby。
  • 是的,这很不幸。希望您的问题现在得到解决。
  • 这确实是我想要的。好吧,首先是内置函数,如果不存在内置函数,则是最好的实现。感谢您的链接。
  • 我不认为它是重复的。解决方案可能相同,但问题不同。
  • ActionScript 应该比这个更成熟,并且有自己的 padding 方法。 :(

标签: apache-flex actionscript-3 padding zero


【解决方案1】:

在性能方面,我更喜欢使用 String 常量和 substr,如下所示:

package {
    public class Helper {
        private static const _ZEROS:String = "0000000000000000000000000000000000000000"; // 40 zeros, shorten/expand as you wish

        /*
         * f: positive integer value
         * z: maximum number of leading zeros of the numeric part (sign takes one extra digit)
         */
        public static function uint_Zeropadded(f:uint, z:int = 0):String {
            var result:String = f.toString();
            while (result.length < z)
                result = _ZEROS.substr(0, z - result.length) + result;
            return result;
        }
    }
}

与将字符串逐个数多次扩展的性能缺点相比,字符串常量的足迹非常小。在大多数情况下(本例中最多 40 个零),所有调用的指令数都是相同的。

【讨论】:

    【解决方案2】:

    一个非常紧凑的解决方案:

    public function zeroPad(s:String,pad:int):String {
        for(;s.length<pad;s='0'+s);
        return s;
    }
    

    【讨论】:

      【解决方案3】:

      零填充例程 (AS2) 的简短示例...

          Convert = function(Minutes) {
             return ('00'+String(int(Minutes/60)%24)).substr(-2,2);
          }
      

      【讨论】:

        【解决方案4】:
        public static function getFormatedValue(num:Number, roundDecimalPlace:Number=2, showLastZerosInDecimalPlaces:Boolean = false, decimalSeparator:String=".", thousandsSeparator:String=",", currency:String="$"):String
        {
          //assigns true boolean value to neg in number less than 0
          var neg:Boolean = (num < 0);
        
          //make the number positive for easy conversion
          num = Math.abs(num)
        
          var roundedAmount:String = String(num.toFixed(roundDecimalPlace));
        
          //split string into array for dollars and cents
          var amountArray:Array = roundedAmount.split(".");
          var dollars:String = amountArray[0]
          var cents:String = amountArray[1]
        
          //create dollar amount
          var dollarFinal:String = ""
          var i:int = 0
          for (i; i < dollars.length; i++)
          {
            if (i > 0 && (i % 3 == 0 ))
            {
              dollarFinal = thousandsSeparator + dollarFinal;
            }
        
            dollarFinal = dollars.substr( -i -1, 1) + dollarFinal;
          }       
        
          //create Cents amount and zeros if necessary
          var centsFinal:String;
        
          if(showLastZerosInDecimalPlaces)
          {
            centsFinal = String(cents);
        
            var missingZeros:int = roundDecimalPlace - centsFinal.length;
        
            if (centsFinal.length < roundDecimalPlace)
            {
              for (var j:int = 0; j < missingZeros; j++) 
              {
                centsFinal += "0";
              }
            }
          }
          else
          {
            if(Number(cents) != 0)
            {
              centsFinal = String(String(Number("0."+cents)).split(".")[1]);
            }
            else
            {
              roundDecimalPlace = 0;
            }
          }
        
          var finalString:String = ""
        
          if (neg)
          {
            finalString = "-"+currency + dollarFinal
          } else
          {
            finalString = currency + dollarFinal
          }
        
          if(roundDecimalPlace > 0)
          {
            finalString += decimalSeparator + centsFinal;
          } 
        
          return finalString;
        }
        

        【讨论】:

          【解决方案5】:

          Phil's 变体为优雅的recursion

          public function zeroPad (number:String, width:int):String {
              if (number.length < width)
                  return "0" + zeroPad(number, width-1);
              return number;
          }
          

          我不知道它在 AS3 上的表现,但它确实看起来更酷! :-)

          【讨论】:

          • 尽可能避免递归,而且几乎总是可以的
          • @stinkbutt 在这种情况下,recursion 更有意义。我相信这是许多编程课程中没有教授的东西,因为它不像 loop 那样直观,而且实际上它比循环更具限制性。但是说应该尽可能避免有点极端。我会说谨慎使用递归并保持较小,因为它可能会无缘无故变得非常复杂。
          • 我之所以这么说是因为当你使用递归时,堆栈溢出的可能性更大——它可能不会马上显现出来,但从长远来看,你可能会无意中造成大量数据的情况再加上几个递归方法,你的应用程序或脚本就会崩溃。
          • @sinkbutt 好吧,如果这对我不知道的 actionscript 来说是真的,那么我必须同意你的观点以始终避免它,因为它总是可以避免的。但是递归存在于 loops 之前的编程语言中,它永远不会“更有可能”使用 'em 产生溢出。
          • 使用递归的原因是为了在问题更适合可简化问题时清楚。迭代方法几乎总是比递归方法更快、更有效。
          【解决方案6】:

          我确实在 AS3 中维护了一个 printf: 不幸的是堆栈溢出不会让我发布链接,但如果谷歌代码的项目名称是 printf-as3

          随时欢迎反馈。

          --

          http://code.google.com/p/printf-as3/

          【讨论】:

            【解决方案7】:
            /** 
             * originally by Chris Agiasotis @ http://agitatedobserver.com/as3-currency-formatter/
             * improved by Joseph Balderson @ http://www.joeflash.ca
             */
            package
            {
                public class CurrencyFormat
                {
                    public function CurrencyFormat(){ }
            
                    public function getCurrency(num:Number,
                                decimalSeparator:String=".",
                                decimalPlace:Number=2,
                                currency:String="$",
                                thousandsSeparator:String=","
                            ):String
                    {
                        //assigns true boolean value to neg in number less than 0
                        var neg:Boolean = (num < 0);
            
                        //make the number positive for easy conversion
                        num = Math.abs(num)
            
                        var roundedAmount:String = String(num.toFixed(decimalPlace));
            
                        //split string into array for dollars and cents
                        var amountArray:Array = roundedAmount.split(".");
                        var dollars:String = amountArray[0]
                        var cents:String = amountArray[1]
            
                        //create dollar amount
                        var dollarFinal:String = ""
                        var i:int = 0
                        for (i; i < dollars.length; i++)
                        {
                            if (i > 0 && (i % 3 == 0 ))
                            {
                                dollarFinal = thousandsSeparator + dollarFinal;
                            }
            
                            dollarFinal = dollars.substr( -i -1, 1) + dollarFinal;
                        }   
            
                        //create Cents amount and zeros if necessary
                        var centsFinal:String = String(cents);
            
                        var missingZeros:int = decimalPlace - centsFinal.length;
            
                        if (centsFinal.length < decimalPlace)
                        {
                            for (var j:int = 0; j < missingZeros; j++) 
                            {
                                centsFinal += "0";
                            }
                        }
            
                        var finalString:String = ""
            
                        if (neg)
                        {
                            finalString = "-"+currency + dollarFinal
                        } else
                        {
                            finalString = currency + dollarFinal
                        }
            
                        if(decimalPlace > 0)
                        {
                            finalString += decimalSeparator + centsFinal;
                        } 
            
                        return finalString;
                    }
                }
            }
            

            【讨论】:

              【解决方案8】:
              public function zeroPad(number:int, width:int):String {
                 var ret:String = ""+number;
                 while( ret.length < width )
                     ret="0" + ret;
                 return ret;
              }
              

              【讨论】:

                猜你喜欢
                • 1970-01-01
                • 2013-08-09
                • 2013-10-26
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                • 2010-11-08
                • 2020-04-17
                相关资源
                最近更新 更多