搜尋部落格文章

2013年3月5日 星期二

NumberFormatter 地區貨幣格式化

  /**
   * 四捨五入格式化數字小數精度,預設整數,使用千分位
   * @param number Number 要格式化的數字
   * @param decimalCount int 小數的個數,預設0
   * @param useThousandsSeparator Boolean 是否使用千分位, 預設true
   * @return 格式化後的字串
   */
  public static function formatNumberDecimal(number:Number, decimalCount:int = 2, useThousandsSeparator:Boolean = true):String {
   var numberFormatter:NumberFormatter = new NumberFormatter("en-US");
   //小數分隔符號  
   numberFormatter.decimalSeparator = ".";
   //小數點後的位數
   numberFormatter.fractionalDigits = decimalCount;
   //是否自動在小數後補位
   numberFormatter.trailingZeros = false;
   //當小數左側沒有整數時,加上前導0,例如:0.1  
   numberFormatter.leadingZero = true;
   
   //3;* 123,456,789.12  
   //3;2;* 12,34,56,789.12  
   //3 123456,789.12  
   //分組表達式,採用3位一組的千分法  
   numberFormatter.groupingPattern = "3;*";
   //千分位的分組  
   numberFormatter.useGrouping = useThousandsSeparator;
   //千分位的分隔符  
   numberFormatter.groupingSeparator = ",";
   //返回格式化後的字串  
   return numberFormatter.formatNumber(number);
  }

2013年3月4日 星期一

[轉] AS3複製顯示物件

一,複製舞台上的影片剪

方法1——反射方法: 

var ClassRef:Class = getDefinitionByName(getQualifiedClassName(t_mc)) as Class; 

var clone_mc:DisplayObject = new ClassRef(); 

addChild(clone_mc); 

方法2——構造器方法: 

var ClassRef:Class = t_mc.constructor; 

var clone_mc:MovieClip = new ClassRef(); 

addChild(clone_mc); 

方法3——編譯器自動生成類方法: 

此方法是方法1的變種,它比方法1更加簡單、粗暴、有效。下面我將為大家特別講解一下這個方法: 

首先,在庫中創建一個影片剪輯,隨意繪製一個圖形,然後在第一幀上加上一個單行註釋符“//”; 

接下來,將剛才創建的影片剪輯拖到舞台上,創建一個示例,命名為“t_mc”; 

現在,重點來了,我們在主時間線上寫下如下所示語句,然後按下Ctrl+Enter,仔細觀察一下輸出面板中輸出的信息。 

trace(getQualifiedClassName(t_mc)); 

你發現,輸出結果是“_fla::Timeline_1 ”。出於對函數getQualifiedClassName的作用的清晰理解,你立刻就想到,這個Timeline_1應該就是編譯器自動為我們的庫中的影片剪輯創建的類。我們貌似可以用這個類new出多個一樣的影片剪輯來哦!是不是這樣呢?我們來驗證一下: 

var clone_mc:DisplayObject = new Timeline_1(); 

addChild(clone_mc); 

Ctrl+Enter,你驚喜的發現,我們成功了!實驗到這裡,可能很多朋友已經興奮地準備去寫學習總結了。兄弟們,不要急,我們的實驗還沒完——現在,我們用同樣的方法,再次在庫中創建一個影片剪輯。然後也將它拖到舞台上創建一個實例,取名為“d_mc”。接下來,我們將trace(getQualifiedClassName(t_mc)); 語句中的“t_mc”改成“d_mc”。測試一下影片,這次輸出的結果竟然是“flash.display::MovieClip”。 

忽忽!傻了吧,不能用new MovieClip來複製“d_mc”了吧! 

咋解決這個問題呢?我給大家一點點提示:試試將庫中那兩個影片剪輯各取一個響亮的名字(名稱),然後再看一下輸出的類名是什麼。 

使用以上方法複製影片剪輯時需要注意: 

必須在庫中創建影片剪輯,並將庫中的影片剪輯拖到舞台上創建了一個實例; 
影片剪輯的幀上必須包含代碼(註釋也行,最簡單的就是加一個單行註釋符號“//”); 

二,複製Loader加載的swf 

複製外部加載的swf是一個相對高級的操作,步驟比較多,過程相對複雜,要闡述清楚原理細節需要很大篇幅的文字,因此,這裡我就偷懶不詳細寫說明了,純用代碼來說明問題,希望對看得懂的朋友起到拋磚引玉的作用。 

方法1——ByteArray深度複製

var byteLoader:URLLoader = new URLLoader(); 

byteLoader.dataFormat = URLLoaderDataFormat.BINARY; 

byteLoader.addEventListener(Event.COMPLETE, loadCompleteHandler); 

var loader:Loader = new Loader(); 

loader.y = 200; 

addChild(loader); 

loader.contentLoaderInfo.addEventListener(Event.INIT, loadInitHandler); 

function loadInitHandler(evt:Event):void 



var cloneLoder:Loader = new Loader(); 

addChild(cloneLoder); 

cloneLoder.loadBytes(byteLoader.data); 



byteLoader.load(new URLRequest("t.swf")); 

function loadCompleteHandler(evt:Event):void 



loader.loadBytes(byteLoader.data); 



簡單原理:用URLLoader將外部的swf以二進制數據格式加載到ByteArray中,然後用Loader類的loadBytes去加載URLLoader中的ByteArray。 

方法2——ApplicationDomain 運行時動態類複製

var loader:Loader = new Loader(); 

loader.y = 200; 

addChild(loader); 

loader.contentLoaderInfo.addEventListener(Event.INIT, loadInitHandler); 

var context:LoaderContext = new LoaderContext(); 

context.applicationDomain=ApplicationDomain.currentDomain; 

loader.load(new URLRequest("t.swf"), context); 

function loadInitHandler(evt:Event):void 



var ClassRef:Class = loader.contentLoaderInfo.applicationDomain.getDefinition("TestClass") as Class; 

var clone_mc: MovieClip = new ClassRef(); 

addChild(clone_mc); 



注意: 

1.以上兩種複制方法,由於都需要加載swf文件,因此需要文件級別的本地安全性; 
2.使用第二種方法(ApplicationDomain)時,生成“t.swf”時必須為舞台添加文檔類屬性。添加的文檔類可以是具體的外部as類,也可以僅僅是一個名字。上例中我添加的文檔名為”TestClass”, getDefinition("TestClass")中填的參數內容應該跟要復制的swf的文檔類名相同。 
3. ApplicationDomain還有更多高級用法,有興趣的高級AS程序員可以去研究一下。 

出處:http://hi.baidu.com/javabbs/blog/item/dcb9a1456269182dcefca32d.html