可以将文章内容翻译成中文,广告屏蔽插件可能会导致该功能失效(如失效,请关闭广告屏蔽插件后再试):
问题:
Duplicate of this one.
What would you use to pad zeroes to the left of a number in Flex/AS3?
Is there an equivalent to printf
or NumberFormat
that does this?
I'm looking for the nicest implementation of this or something similar:
public function zeroPad(number:int, width:int):String {
// number = 46, width = 4 would return "0046"
}
回答1:
public function zeroPad(number:int, width:int):String {
var ret:String = ""+number;
while( ret.length < width )
ret="0" + ret;
return ret;
}
回答2:
Performance-wise, I prefer using a String constant and substr, like this:
package {
public class Helper {
private static const _ZEROS:String = "0000000000000000000000000000000000000000"; // 40 zeros, shorten/expand as you wish
/*
* f: positive integer value
* z: maximum number of leading zeros of the numeric part (sign takes one extra digit)
*/
public static function uint_Zeropadded(f:uint, z:int = 0):String {
var result:String = f.toString();
while (result.length < z)
result = _ZEROS.substr(0, z - result.length) + result;
return result;
}
}
}
The String constant has very little footstamp compared to the performance draw-backs of extending the string one by one digit numerous times. In most cases (up to 40 zeros in this example) number of instructions is the same for all calls.
回答3:
Phil's variant as an elegant recursion:
public function zeroPad (number:String, width:int):String {
if (number.length < width)
return "0" + zeroPad(number, width-1);
return number;
}
I don't know of its performance on AS3 but it sure looks cooler! :-)
回答4:
public static function getFormatedValue(num:Number, roundDecimalPlace:Number=2, showLastZerosInDecimalPlaces:Boolean = false, decimalSeparator:String=".", thousandsSeparator:String=",", currency:String="$"):String
{
//assigns true boolean value to neg in number less than 0
var neg:Boolean = (num < 0);
//make the number positive for easy conversion
num = Math.abs(num)
var roundedAmount:String = String(num.toFixed(roundDecimalPlace));
//split string into array for dollars and cents
var amountArray:Array = roundedAmount.split(".");
var dollars:String = amountArray[0]
var cents:String = amountArray[1]
//create dollar amount
var dollarFinal:String = ""
var i:int = 0
for (i; i < dollars.length; i++)
{
if (i > 0 && (i % 3 == 0 ))
{
dollarFinal = thousandsSeparator + dollarFinal;
}
dollarFinal = dollars.substr( -i -1, 1) + dollarFinal;
}
//create Cents amount and zeros if necessary
var centsFinal:String;
if(showLastZerosInDecimalPlaces)
{
centsFinal = String(cents);
var missingZeros:int = roundDecimalPlace - centsFinal.length;
if (centsFinal.length < roundDecimalPlace)
{
for (var j:int = 0; j < missingZeros; j++)
{
centsFinal += "0";
}
}
}
else
{
if(Number(cents) != 0)
{
centsFinal = String(String(Number("0."+cents)).split(".")[1]);
}
else
{
roundDecimalPlace = 0;
}
}
var finalString:String = ""
if (neg)
{
finalString = "-"+currency + dollarFinal
} else
{
finalString = currency + dollarFinal
}
if(roundDecimalPlace > 0)
{
finalString += decimalSeparator + centsFinal;
}
return finalString;
}
回答5:
Very short example of zero padding routine (AS2)...
Convert = function(Minutes) {
return ('00'+String(int(Minutes/60)%24)).substr(-2,2);
}
回答6:
/**
* originally by Chris Agiasotis @ http://agitatedobserver.com/as3-currency-formatter/
* improved by Joseph Balderson @ http://www.joeflash.ca
*/
package
{
public class CurrencyFormat
{
public function CurrencyFormat(){ }
public function getCurrency(num:Number,
decimalSeparator:String=".",
decimalPlace:Number=2,
currency:String="$",
thousandsSeparator:String=","
):String
{
//assigns true boolean value to neg in number less than 0
var neg:Boolean = (num < 0);
//make the number positive for easy conversion
num = Math.abs(num)
var roundedAmount:String = String(num.toFixed(decimalPlace));
//split string into array for dollars and cents
var amountArray:Array = roundedAmount.split(".");
var dollars:String = amountArray[0]
var cents:String = amountArray[1]
//create dollar amount
var dollarFinal:String = ""
var i:int = 0
for (i; i < dollars.length; i++)
{
if (i > 0 && (i % 3 == 0 ))
{
dollarFinal = thousandsSeparator + dollarFinal;
}
dollarFinal = dollars.substr( -i -1, 1) + dollarFinal;
}
//create Cents amount and zeros if necessary
var centsFinal:String = String(cents);
var missingZeros:int = decimalPlace - centsFinal.length;
if (centsFinal.length < decimalPlace)
{
for (var j:int = 0; j < missingZeros; j++)
{
centsFinal += "0";
}
}
var finalString:String = ""
if (neg)
{
finalString = "-"+currency + dollarFinal
} else
{
finalString = currency + dollarFinal
}
if(decimalPlace > 0)
{
finalString += decimalSeparator + centsFinal;
}
return finalString;
}
}
}
回答7:
I do maintain a printf in AS3:
Unfortunately stack overflow won't let me post links, but if the google code's project name is printf-as3
Feedback is always welcome.
--
http://code.google.com/p/printf-as3/
回答8:
A very compact solution:
public function zeroPad(s:String,pad:int):String {
for(;s.length<pad;s='0'+s);
return s;
}