4

I just wrote this incredibly verbose code to turn numbers like 2 into 02. Can you make this function shorter, please (maintaning the functionality)?

    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;
    }

Please use types for variables. Extra points (good-vibe points, not SO points) if there's already a built-in function that I don't know about.

If anybody wants to post some extremely short equivalent in some other language, that would be fun too.

4

9 に答える 9

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 に答える
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" 変数を使用すると、ループする必要がなくなります。事前に作成された文字列から必要な数のゼロを前に追加するだけです。

于 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 に答える
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の最後の関数はほとんど正しいですが、彼の'>'は'<'である必要があります。

この関数は、必要に応じて実行されます(かなり徹底的にテストされています)。

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

私は常に、すべてのゼロを含むゼロの最大パディング幅である文字列を取得し、その文字列をゼロ文字列の最後にパディングするように追加し、サブ文字列を使用して右側の長さの数字を取得することによってこれを行ってきました。

何かのようなもの:

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

「非常に短い同等のものを他の言語で投稿したい人がいれば、それも楽しいでしょう。」

JavaScript で簡単です - これをブラウザのアドレスバーに貼り付けます

javascript: function zit(n, w) {var z="00000000000000000"; return (z+n).substr(-w);} アラート(zit(567, 9)); ボイド (0);

于 2009-03-04T21:36:47.453 に答える
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 に答える