4

我刚刚写了这个非常冗长的代码来把像 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 点)。

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

4

9 回答 9

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 消除了循环的需要,只需从预构建的字符串中添加所需的任意多个零即可。

于 2009-03-04T18:55:42.973 回答
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);
 }
于 2009-03-04T18:58:28.800 回答
4

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

public static function pad(num:int, minLength:uint):String {
    var str:String = num.toString();
    while (str.length < minLength) str = "0" + str;
    return str;
}
于 2009-03-05T08:53:52.850 回答
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);
}

顺便说一句,没有内置功能可以做到这一点。如果您需要像样的填充功能,请查看 Apache Commons Lang 中的StringUtils

于 2009-03-04T19:04:18.147 回答
2

向 dirkgently 和所有其他在这里做出回应的人表示支持,但显然人们在没有实际尝试代码的情况下投票。

dirkgently 的最终功能大部分是正确的,但他的 '>' 需要是一个 '<'。

此功能按预期执行(经过相当彻底的测试):

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);
}
于 2009-05-29T21:09:51.643 回答
1

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

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

javascript: 函数 zit(n, w) {var z="000000000000000000"; 返回 (z+n).substr(-w);} alert(zit(567, 9)); 无效(0);

于 2009-03-04T21:36:47.453 回答
1

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

就像是:

function pad(num:int, length:unit):String{
    var big_padded:String "0000000000000000000000000000" + num.toString();
    return big_padded.substring(big_padded.length - length);
 }
于 2009-03-05T13:36:20.407 回答
1

adobe 推出的 as3corelib 包有一个不错的 NumberFormatter 小类,它使用了一系列 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;
}

我包含这个函数只是为了展示它的简单性,但我会使用包而不是函数,因为它提供了许多其他有用的功能,如 StringUtils、MD5 等加密方法、blowfish 等。

您可以在此处下载包 对于新用户,您必须提供该包所在的类路径。导入类而不是使用它们的完全限定的类名也很聪明。

于 2009-03-07T00:21:44.013 回答
0
private function leadingZeros(value:int, numDigits:int):String
{
            return String(new Array(numDigits + 1).join("0") + String(value)).substr(-numDigits, numDigits);
}
于 2014-07-02T19:54:23.200 回答