10 Stimmen

Was würden Sie verwenden, um eine Zahl in Flex/AS3 mit Nullen aufzufüllen?

Duplikat von este ein.

Womit würden Sie in Flex/AS3 Nullen links von einer Zahl auffüllen?

Gibt es ein Äquivalent zu printf o NumberFormat das dies tut?

Ich bin auf der Suche nach einer möglichst guten Umsetzung dieser oder einer ähnlichen Lösung:

public function zeroPad(number:int, width:int):String {
    // number = 46, width = 4 would return "0046"
}

1 Stimmen

Es handelt sich in der Tat um ein Duplikat, obwohl ich es mit der Suchmaschine nie gefunden habe, weil es nicht von Nullen, Auffüllungen und Zahlenformatierungen spricht und die Formulierung Ruby-like im Titel hat.

0 Stimmen

Ja, das ist sehr bedauerlich. Ich hoffe, Ihr Problem ist jetzt gelöst.

0 Stimmen

Es war in der Tat das, wonach ich gesucht hatte. Nun, zunächst nach einer eingebauten Funktion und der besten Implementierung, wenn es keine eingebaute Funktion gibt. Danke für den Link.

26voto

Phil Punkte 841
public function zeroPad(number:int, width:int):String {
   var ret:String = ""+number;
   while( ret.length < width )
       ret="0" + ret;
   return ret;
}

3voto

Gabor Simon Punkte 31

Aus Leistungsgründen ziehe ich es vor, eine String-Konstante und substr zu verwenden, etwa so:

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

Die String-Konstante hat nur einen geringen Fußabdruck im Vergleich zu den Leistungseinbußen, die entstehen, wenn der String mehrmals um eine Stelle verlängert wird. In den meisten Fällen (bis zu 40 Nullen in diesem Beispiel) ist die Anzahl der Anweisungen für alle Aufrufe gleich.

2voto

cregox Punkte 16639

Phil's Variante als elegante Rekursion :

public function zeroPad (number:String, width:int):String {
    if (number.length < width)
        return "0" + zeroPad(number, width-1);
    return number;
}

Ich weiß nicht, wie die Leistung auf AS3 ist, aber es sieht auf jeden Fall cooler aus! :-)

0 Stimmen

Eine Rekursion sollte nach Möglichkeit vermieden werden, und das ist fast immer möglich

1 Stimmen

In diesem Fall @stinkbutt, Rekursion macht mehr Sinn. Ich glaube, das ist etwas, das in vielen Programmierkursen nicht gelehrt wird, weil es nicht so intuitiv ist wie ein Schleife und in der Tat ist sie einschränkender als eine Schleife. Aber sagen sie sollte nach Möglichkeit vermieden werden ist ein bisschen extrem. Ich würde sagen Rekursion mit Bedacht einsetzen und klein halten Denn es kann sehr kompliziert werden, ohne dass es dafür einen Grund gibt.

0 Stimmen

Der Grund dafür ist, dass ein Stapelüberlauf wahrscheinlicher ist, wenn Sie Rekursion verwenden - es mag nicht sofort offensichtlich sein, aber langfristig können Sie unbeabsichtigt eine Situation schaffen, in der eine große Menge an Daten in Verbindung mit sogar nur ein paar rekursiven Methoden Ihre Anwendung oder Ihr Skript in die Knie zwingt.

1voto

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

1voto

Bert Punkte 61

Sehr kurzes Beispiel für eine Null-Padding-Routine (AS2)...

    Convert = function(Minutes) {
       return ('00'+String(int(Minutes/60)%24)).substr(-2,2);
    }

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X