숫자에 국가의 통화표시를 하고 싶을 때는 뭐..그냥 개발하여도 되지만 NumberFormat에 currencyFormat()라는 것이 있으니 사용법을 살펴보자...

NumberFormat을 사용하여 10,000,000,000등의 값을 마스크를 적용하여 format이라는 메서드를 통해 반환받는것을 보았다. 반환시에 국가의 통화기호를 자동으로 붙여서 반환하도록 하기 위해서는 currencyFormat()를 사용하는데 format과 마찬가지로 국가를 선택하여야 한다. 국가가 없을 때는 심볼을 바꾸어 표시한다.

var numberFormat:NumberFormat = new NumberFormat( );
trace( numberFormat.currencyFormat(10000) )      // 출력 : €10,000.00
이처럼 currencyFormat을 사용하면 format()처럼 그루핑과 소수점을 분리하는데 앞이나 뒤에 국가의 화폐기호를 붙여준다. 위의 코드에서는 국가를 정하지 않았기 때문에 switch의 default인 " €(\u20AC) "를 출력하게 되었다. 따라서 국가 Locale을 정해서 넘겨야한다.

trace( numberFormat.currencyFormat(10000 , new Locale(Locale.KOREA) ) )
// 출력 : 10,000.00원

숫자뒤에 오는 파라미터에 국가를 설정하면 해당국가에 맞추어서 금액을 출력한다.
* 위의 결과는 한국에 맞게 NumberFormat와 Locale을 아래와 같이 수정하였습니다.
외국에서 만든 라이브러리 이므로 받아서 각자 수정해서 사용하도록 자리만 잡아두고 있어 정확한 화폐단위가 출력 되지 않습니다. 따라서 Locale클래스에 우리나라 국가를 추가하였다

...Loacle클래스
public static const KOREA:String = "kr";

그리고 NumberUtilities클래스의 case문에서 우리나라에 해당하는 자리를 수정하였다.
....NumberFormat
 case "kr":      
 // 원래 sv라는 족보도 없는 기호로 우리 국가명이 검색되었었다..이를 kr로 수정하였다.

          oSymbols.currency = "원";        
         // 이곳에 kr이라는 화폐기호가 있었다. 이것을 "원"으로 수정하였다

          oSymbols.group = bCurrency ? "," : " ";
          oSymbols.decimal = ".";
          oSymbols.before = false;
          break;
이처럼 수정하였다면 Locale.KOREA로 국가를 설정할 수 있다.

수정하기 싫으신 분들이나 1번정도만 다른  기호를 보여주어야 할 때 오브젝트를 통해 값을 그때 그때 마다 수정할 수 있다.

trace( numberFormat.currencyFormat(10000 ,
{ group:"," , decimal:"." , currency:"원" , before : false } ) )
// 출력 : 10,000.00원

두번째 파라미터에 오브젝트를 넘겨 각 심벌을 교체한다. currency는 화폐기호나 특정 심볼을 적으면 되고
before는 true이면 기호가 숫자앞에 위치하고 false면 숫자 뒤에 위치한다.

* format()과 심벌의 수정, 숫자의 mask를 알아보려면
NmberFormat 클래스를 이용한 공백이나 0의 삽입을 참고하면 된다



Posted by 버터백통

금융권이나 결제프로세스 등을 개발할 때 1000원이라는 단위를 표현하기 위해서는 1,000 이라고 뒤에서 부터 3개의 수를 끊고 " , " 컴머로 그룹을 만들어 준다. 또는 정확한 수를 표현하기 위하여 소수점을 섞어서 표현하기도 한다.

가령 1,234.56과 같은 수가 있다. 이처럼 통상적으로 소수점을 표현하거나 컴머로 그룹핑을 하는 것은 AS3에서 제공되지 않는다( 콜드퓨전에서는 제공한다. ) 따라서 이 역할만 전문적으로 전담하는 클래스(수의 단위를 표현하는 기능)가 있어야 한다.
여기서는 ascb의 라이브러리에서 util패키지에 NumberFormat 이라는 클래스를 활용하여 본다.

통상적으로 소수점 4자리까지 표현하고 만단위 까지 그룹핑하여 보여주고 싶다면 NumberFormat()의 생성자에서 마스크를 설정하여도 되고 mask라는 메서드로 접근하여 설정하여도 된다.
(mask는 setter/getter로 이루어져 있다)

* 수의 형태나 그루핑을 정하는 mask
마스크에서 파운드기호(#)는 어떠한 수나 공백으로 채워질 공간이고 ,는 그루핑하는 자리이다. 0은 숫자나 0으로 채워지도록 개발되어 있다.

* 마스크의 상수
0 : 숫자나 0으로 자리를 재워준다.
# : 숫자나 공백으로 자리를 채워준다.
. : 소수점의 공간이다.
, : 숫자를 그룹핑 한다.


##,###.000 이라는 마스크에 12345라는 수를 대입하면 결과는 12,345를 표현하게 된다.
또 1.2345를 대입하면 1.2345로 표현되고 1234.5를 대입하면 1,234.5로 표현된다.
12345      -> 12,345
1.2345     -> 1.2345
1234.5     -> 1,234.5


NumberFormat은 변수에 위임하여 생성한다.
var numberFormat:NumberFormat = new NumberFormat( "##,###.000" );
마스크는 생성자에서 설정하거나 또는 생성 후 mask 메서드를 통해 설정이나 수정할 수 있다.
numberFormat.mask = "#,###.00";
위와 같이 마스크를 ##.00으로 설정한 다음 아래와 같이 테스트한다.
trace(numberFormat.format( 1 ));                // 출력 : 1,00
trace(numberFormat.format( 12 ));              // 출력 : 12,00
trace(numberFormat.format( 123 ));            // 출력 : 123,00
trace(numberFormat.format( 1234 ));           // 출력 : 1.234,00
trace(numberFormat.format( 12345 ));         // 출력 : 1.2345,00


위의 출력 값을 보면 무언가 어색하다. 이는 프랑스나 스페인등에서 사용하는 통화 형식으로 우리와는 느낌이 다르다. 따라서 라이브러리에 Locale.slanguage라는 싱글턴 클래스로 접근하여 언어형식을 정한다. 상수는 Locale을 치고 코드힌트를 참고한다.

var numberFormat:NumberFormat = new NumberFormat( );
numberFormat.mask = "#,###.00";
Locale.slanguage = Locale.ENGLISH;
trace(numberFormat.format( 1 ));               // 출력 : 1.00
trace(numberFormat.format( 12 ));              // 출력 : 12.00
trace(numberFormat.format( 123 ));            // 출력 : 123.00
trace(numberFormat.format( 1234 ));           // 출력 : 1,234.00
trace(numberFormat.format( 12345 ));         // 출력 : 1,2345.00

trace(numberFormat.format( 12.3 ));            // 출력 : 12.30
trace(numberFormat.format( 123.4 ));           // 출력 : 123.40
trace(numberFormat.format( 1234.5 ));         // 출력 : 1,234.50


* 심벌 기호를 바꾸고 싶다
그루핑을 하는 " , " 심벌과 소수점을 표시하는 " . " 심벌은 다른 심벌로 교체가 가능하다.
var numberFormat:NumberFormat = new NumberFormat( );
trace(numberFormat.format( 1234567.89 , { group:" 컴머 " , decimal:" 점 " } ) ); 
// 출력 : 1 컴머 234 컴머 567 점 89

trace(numberFormat.format( 1234567.89 , { group:" * " , decimal:" ? " } ) );
 
// 출력 : 1 * 234 * 567 ? 89

delegate 객체에서 format을 정할 때 두번 째 파라미터의 값인 오브젝트를 통해
그룹을 정하는 group의 기호를 문자열로 선언하고, 소수점을 구분하는 기호인 decimal의 값도 문자열로
재선언하면 선언된 심벌로 교체하여 값을 보여준다.


AS3 cookbook이라는 사이트에서 이러한 라이브러리를 제공하고 있다.
라이브러리 다운로드

Posted by 버터백통