2009-03-04 76 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; 
} 
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; 
} 

的「零」變種消除了循環的需要,只是在前面加上然而,你需要從預先構建的字符串中獲得很多零。

+0

這實際上是相當不錯的。我喜歡。謝謝。 – 2009-03-04 19:04:55

+0

請注意,我稍微改變了這個問題,因爲我的原始代碼有點煩人(將Number更改爲int的方式不正確)。 – 2009-03-04 19:08:42

+0

這個答案有幾個優點:靜態字符串只實例化一次,子字符串函數可能會產生一個字符串。你怎麼知道要使用多少個零點? – 2009-03-04 23:03:36

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

哇,輝煌......我將不得不嘗試這一個。謝謝! – 2009-03-04 19:05:34

+0

等一下:難道這不是拿着數字32.3和5個零點,把它變成00023嗎?反過來也會扭轉超過9的任何數字...... – 2009-03-04 19:06:19

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

1

「如果有人想在一些 其他語言來發布一些 極短的等價物,這將是一種樂趣。」

在javascript中很容易 - 粘貼到瀏覽器的地址欄中

的javascript:功能青春痘(N,W){VAR Z = 「000000000000000000」; return(z + n).substr(-w);} alert(zit(567,9));空隙(0);

1

我一直通過採取一個字符串,這樣做即包含所有零的零的最大填充寬度,然後將字符串附加到填充到零字符串末尾的字符串,然後使用子字符串獲取右手長度數字。

喜歡的東西:

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

as3corelib包推出由Adobe已經使用了一系列的靜態類的一個可愛的小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

道具以及所有其他人在這裏迴應,但顯然人們沒有真正嘗試代碼投票。

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); 
} 
0
private function leadingZeros(value:int, numDigits:int):String 
{ 
      return String(new Array(numDigits + 1).join("0") + String(value)).substr(-numDigits, numDigits); 
}