类似Ruby的问题:缩短此功能(ActionScript 3)

时间:2009-03-04 18:36:21

标签: actionscript-3 actionscript verbosity

我刚写了这个令人难以置信的冗长代码,将2之类的数字转换成02. 你能否缩短这个功能,请(保留功能)?

    public static function format(n:int, minimumLength:int):String {
        var retVal:String = n.toString();
        var stillNeed:int = minimumLength - retVal.length;
        for (var i:int = 0; i < stillNeed; i++) {
            retVal = "0" + retVal;
        }
        return retVal;
    }

请使用变量类型。如果已经有一个我不知道的内置功能,那么额外的积分(良好的氛围点,而不是SO点)。

如果有人想用其他语言发布一些极短的等价物,那也很有趣。

9 个答案:

答案 0 :(得分:4)

我认为没有内置方式,但这可能更清晰(如果不一定表现更好):

//20 zeroes, could be more if needed
public static var Zeroes:String = "00000000000000000000"   

public static function format(n:Number, minimumLength:int):String {
var retVal:String = (n.toFixed(0)); // cut off the decimals
var stillNeed:int = minimumLength - retVal.length;
retVal = Zeroes.substring(0, stillNeed) + retVal; 
return retVal;
}

“zeroes”var消除了循环的需要,只需从预构建的字符串中预先添加许多零。

答案 1 :(得分:4)

Christophe Herreman几乎是正确的,但他的方法增加了更多的零而不是差异量。我修了一下:

public static function format(n:int, minimumLength:int):String {
  var v:String = n.toString();
  var stillNeed:int = minimumLength - v.length;       
  return (stillNeed > 0) ? v : String(Math.pow(10, stillNeed) + v).substr(1);
}

我之前的尝试:

 public static function format(n:int, minimumLength:int):String {
    var stillNeed:int = minimumLength - n.toString().length;               
    return (n.split("").reverse().join("") as int) // 32 -> 23
             *Math.pow(10, stillNeed > 0 ? stillNeed : 0).toString() // 23000
                 .split("").reverse().join("");  // 00032
 }

 public static function formatAny(n:Number, minimumLength:int):String {
    return format((int)n) + n.toString().split('.')[ 1 ];
 }

 // use this if you want to handle -ve numbers as well
 public static function formatAny(n:Number, minimumLength:int):String {
    return (n < 0 ? '-' : '') + formatAny(n, minimumLength);
 }

答案 2 :(得分:4)

这不是最快的实现(它做了一些不必要的复制并且有一个循环),但 很好且可读:

public static function pad(num:int, minLength:uint):String {
    var str:String = num.toString();
    while (str.length < minLength) str = "0" + str;
    return str;
}

答案 3 :(得分:3)

这个怎么样:

public static function format(n:int, len:int):String {
  var v:String = n.toString();
  return (v.length >= len) ? v : String(Math.pow(10, len) + n).substr(1);
}

btw没有内置功能。如果你需要不错的填充函数,请查看Apache Commons Lang中的StringUtils

答案 4 :(得分:2)

道德以及所有在这里做出回应的其他人,但显然人们在没有实际尝试代码的情况下进行投票。

dirkgently的最终功能大多是正确的,但他的'&gt;'需要是'&lt;'。

此功能可根据需要执行(相当彻底地测试):

public static function format(n:int, minimumLength:int):String {
  var v:String = n.toString();
  var stillNeed:int = minimumLength - v.length;
  return (stillNeed < 0) ? v : String(Math.pow(10, stillNeed) + v).substr(1);
}

答案 5 :(得分:1)

  

“如果有人想张贴一些   在一些人中极短   其他语言,也很有趣。“

在javascript中很简单 - 将其粘贴到浏览器的地址栏

javascript:function zit(n,w){var z =“000000000000000000”; return(z + n).substr(-w);} alert(zit(567,9));空隙(0);

答案 6 :(得分:1)

我总是通过获取一个字符串来完成此操作,该字符串是包含全零的零的最大填充宽度,然后将该字符串添加到填充到零字符串的末尾,然后使用子字符串来获取右手长度数字。

类似的东西:

function pad(num:int, length:unit):String{
    var big_padded:String "0000000000000000000000000000" + num.toString();
    return big_padded.substring(big_padded.length - length);
 }

答案 7 :(得分:1)

adobe推出的as3corelib包有一个很好的LittleFormatter类,它使用一系列STATIC类。在这种情况下,您可以使用addLeadingZero函数。

//The following method is from the NumberFormatter class of the as3corelib package by Adobe.
public static function addLeadingZero(n:Number):String
{
var out:String = String(n);

if(n < 10 && n > -1)
{
    out = "0" + out;
}

return out;
}

我包含该函数只是为了表明它的简单性,但我会使用该包而不是通过yoinking函数,因为它提供了许多其他有用的功能,如StringUtils,加密方法,如MD5,河豚等。

您可以下载包here 对于较新的用户,您必须提供此程序包所在位置的类路径。导入类而不是使用完全限定的类名也很聪明。

答案 8 :(得分:0)

private function leadingZeros(value:int, numDigits:int):String
{
            return String(new Array(numDigits + 1).join("0") + String(value)).substr(-numDigits, numDigits);
}