2009-03-04 16 views
4

2のような数字を02に変換する、この信じられないほど冗長なコードを書きました。この機能を短くすることはできますか?Rubyのような質問:この関数を短くする(ActionScript 3)

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

これは(それはいくつかの不必要なコピーを行い、ループを持っている)最速の実装ではないでしょうが、それは素晴らしく、読みやすいです:

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

いいです。内部的にはそれは私のものと同じですが、コードワイズでははるかに読みやすくなります。 –

4

(必ずしもより高性能場合)私は、組み込みの方法があるとは思わないが、これはきれいかもしれません:「ゼロ」varがちょうど先頭に追加、ループの必要性を排除し

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

あらかじめ作成された文字列から多くのゼロが必要です。

+0

実際には非常にうれしいです。私はそれが好きです。ありがとう。 –

+0

元のコードがもう少し面倒だったので(私の数を間違ってintに変更したので)、質問を少し変更しました。 –

+0

この回答にはいくつかの利点があります。静的なStringは一度だけインスタンス化され、部分文字列関数はおそらく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); 
} 
+0

うわー、華麗な...私はこれを試してみる必要があります。ありがとうございました! –

+0

ほんの少し待ってください:これは、5の最小値で32.3の数字を取り、それを00023に変換しませんか?また逆に9を超える数字が反転します... –

+0

私の指が交差しています:これをテストするためにしばらく前に死んだFB3はありません。だから、みんな...;) – dirkgently

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を見てください。

1

「誰もがいくつかの 他の言語では、いくつかの 極端に短いと同等を投稿したい場合、それはあまりにも楽しいだろう。」

JavaScriptでそれは簡単です - ブラウザのアドレスバーに貼り付ける

のjavascript:(N、W)関数にきび{VARさz = "000000000000000000"; return(z + n).substr(-w);}警告(zit(567,9)); void(0);

+0

美容。私はまだ私の心の中に私が常に嫌っていた言語のための部屋を持っています... :) –

+0

2番目の考えでは、それは上記のDaveの答えと同等です...しかし、それは可能です - JavaScriptは甘いです。再度、感謝します。 –

1

私は常に文字列を取ることによって、これをやりましたつまり、すべてのゼロを含む0の最大埋め込み幅です。その後、ゼロストリングの末尾にパディングする文字列を付加し、次に部分文字列を使用して右手長の数字を取得します。

何かのように:Adobeが出し

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

1)Daveの答えに似ていますが、もう少しセクシーです。 2)ゼロストリングは静的でなければならないので、1回だけヒットします。3)もう一度、ストリングに入れるゼロ数を知るにはどうすればいいですか?ありがとう! –

+0

あなたが必要とするかもしれない多くのゼロを入れます。ゼロ文字列の長さと長さの長さの長さの長さを比較することで、エラーをチェックできます。 –

+0

リチャードに感謝します。それは実際問題です。何人が必要なのでしょうか。可能な答えは、Number、IMOの最大長と関係があるはずです。 –

1

as3corelibパッケージには、STATIC一連のクラスを使用して素晴らしい小さなNumberFormatterクラスを持っています。この場合、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、フグのような暗号化方式のような他の多くの便利な機能を提供しますので、私は機能をyoinking代わりにパッケージを使用します

パッケージhere をダウンロードできます。新しいユーザーには、このパッケージの存在場所へのクラスパスを提供する必要があります。完全修飾クラス名を使用する代わりにクラスをインポートすることも賢明です。

2

ここに返答してくれたすべての人と、実際にコードを試していない人は投票しているようです。

最終的な機能はほとんど正しいですが、彼の '>'は '<'である必要があります。

必要に応じて、この関数は、(かなり徹底的にテスト)を実行:

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); 
} 
+0

それは関係ないですが、私はすべてのコードをテストします(それは私の質問です)。私はテストし、コードの修正はありません。これは別のレベルの作業です:)ありがとう! –

+0

同時に、私はオリジナルのものよりも機能が優れているとは思わない。プロセッササイクルを減らすことができません。(推測すると、私は経験的には意味がありません)...私は最良の答えとして選んだものが好きです。 –

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

あなたの答えにいくつかのコメントを追加してください –

関連する問題