Flashhilfe.de - Flash Community

Prototype: Number.prototype.toString [Flash 8]

 


AntwortenRegistrieren Seite1  

BackToDos#1
Benutzerbild von BackToDos
Beiträge: 571
Wohnort: LE
Registriert: Apr 2006

20.03.2007, 00:41

einen Bug aus der Standardroutine beheben

Prototype:
ActionScript:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
/**
* Dieser Prototype soll ein Flashinternes Problem lösen, dass beim
* konvertieren von ganzzahligen Numbers in Strings bei anderen Basen als 10 (beispielsweise hex) auftaucht
* ist die Basis nicht 10 und die Zahl ganzzahlig wird scheinbar der Wert intern einer 4-Byte-Integervariablen zugewiesen,
* welche (wegen Vorzeichen) ein Maximalwert von 2147483647 hat, um dann diese dann in einen String umzuwandeln.
* Übersteigt die ursprüngliche Ganzzahl den kritischen Wert, gibt es einen overflow und es kommt Müll raus.
* Da Flash Ganzzahlen bis zu 2^49 als solche handhabt und der maximalwert bei 2^31-1 liegt, kann das durchaus mal passieren
* Beispiel:
* var n:Number = Math.pow(2,32);
* trace(n);//4294967296
* trace(n.toString());//4294967296
* trace(n.toString(10));//4294967296
* //aber:
* trace(n.toString(16));//0
*
* um dem vorzubeugen wird die Routine so überschrieben, dass sie Zahlen, die zu groß sind geschickt in 2 Teile teilt,
* diese mit Hilfe der alten Routine konvertiert und anschließend zusammenfügt
* ich hoffe, den zahlreichen Flashern, die sich in diesem Randbereich bewegen ist damit geholfen ...
* in diesem Sinne ... ;)
*/

var a:Array = new Array();//Array um für verschiedene Basen Limit und Exponent zu cachen
var f:Function = Number.prototype.toString;//setze Refferenz auf die alte Funktion
Number.prototype.toString = function (radix:Number) {
   if ((this<=1073741824) || (Math.floor(this) != this)) {//wenn es eine kleine Zahl ist oder eine gebrochene
      return f.call(this,radix);//verwende Standard
   }
   else {
      if ((radix == 10) || (radix == undefined)) {//wenn die basis 10 ist oder nicht gegeben (dann wird basis 10 als standard genommen)
         return f.call(this,radix);//verwende Standard
      }
      else {
         var limit:Number = a[radix][0];
         var exp:Number;
         if (limit) {
            exp = a[radix][1];
         }
         else {
            exp = Math.floor(Math.log(1073741824)/Math.log(radix));//höchsten ganzzahligen Exponenten exp errechnen, für den basis hoch exp kleiner der kritischen Grenze ist
            limit = Math.pow(radix,exp);//das daraus resultierende Limit errechnen
            a[radix]=[limit,exp];//cachen
         }
         var lo:Number = this%limit;//hinteren Teil der Zahl absplitten
         var hi:Number = (this-lo)/limit;//vorderen Teil der Zahl absplitten
         var s:String = String(f.call(lo,radix));//den hinteren Teil mit der alten Funktion konvertieren
         while (s.length<exp) s = "0"+s;//zwischenraum mit Nullen füllen
         return f.call(hi,radix)+s;//den vorderen Teil mit der alten Funktion konvertiert vorne dran-klatschen
      }   
   }
}


Beispiel Aufruf:
ActionScript:
1
2
//hmm, eher langweilig
trace(Math.pow(2,40).toString(16));

greetz
back2dos
Schlagwörter: number, prototype
Werbung
Beiträge: 0
Registriert: Feb 2016



AntwortenRegistrieren Seite1  

Schnellantwort

Du musst registriert sein, um diese Funktion nutzen zu können.

 
Ähnliche Beiträge zum Thema
Partner Webseiten: art-and-law.de  Mediengestalter.info   php-resource.de   phpforum.de   phpwelt.de   Pixelio.de   Scubacube.de  
Haftungsausschluss   Datenschutzerklärung   Hier Werben   Impressum
© 1999-2019 Sebastian Wichmann - Flashhilfe.de