Ruby のような質問:この関数を短くする (ActionScript 3)
-
03-07-2019 - |
質問
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 ポイントではなく、良い雰囲気のポイント)。
誰かが他の言語で非常に短い相当物を投稿したい場合は、それも楽しいでしょう。
解決
これは最速の実装ではありません(不必要なコピーを行い、ループがあります)が、 読みやすくて読みやすいです:
public static function pad(num:int, minLength:uint):String {
var str:String = num.toString();
while (str.length < minLength) str = "0" + str;
return str;
}
他のヒント
組み込みの方法があるとは思わないが、これはよりクリーンかもしれない(必ずしもより良いパフォーマンスではないにしても):
//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;
}
<!> quot; zeroes <!> quot; varはループの必要性をなくし、事前に構築された文字列から必要なゼロを追加します。
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);
}
これについてはどうですか:
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 。
こっそりと、ここで応答した他のすべての人に賛成ですが、どうやら人々は実際にコードを試すことなく投票しています。
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);
}
<!> quot;誰かが投稿したい場合 いくつかの非常に短い同等 他の言語、それも楽しいでしょう。<!> quot;
javascriptでは簡単です-これをブラウザのアドレスバーに貼り付けてください
javascript:function zit(n、w){var z = <!> quot; 000000000000000000 <!> quot ;; return(z + n).substr(-w);} alert(zit(567、9)); void(0);
私は常に、すべてのゼロを含むゼロの最大パディング幅である文字列を取得し、ゼロ文字列の最後に文字列を追加してから、サブ文字列を使用して右側の長さの数字を取得することでこれを行ってきました。
次のようなもの:
function pad(num:int, length:unit):String{
var big_padded:String "0000000000000000000000000000" + num.toString();
return big_padded.substring(big_padded.length - length);
}
Adobe が発行した 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 などの暗号化方法、blowfish などの他の多くの便利な機能が提供されているため、関数を追加する代わりにパッケージを使用します。
パッケージをダウンロードできます ここ新しいユーザーの場合は、このパッケージが存在する場所へのクラスパスを指定する必要があります。完全修飾クラス名を使用する代わりにクラスをインポートすることも賢明です。
private function leadingZeros(value:int, numDigits:int):String
{
return String(new Array(numDigits + 1).join("0") + String(value)).substr(-numDigits, numDigits);
}