49.nexacro.Decimal

Edit

49.1nexacro.Decimal 오브젝트 소개

자바스크립트 Number 타입의 안정적인 지원 범위를 벗어나는 데이터를 처리하기 위해 제공하는 오브젝트입니다.

자바스크립트에서는 -(2의 53승 -1)부터 (2의 53승 -1)까지의 값을 처리할 수 있습니다. 이 범위를 벗어나게 되면 잘못된 값이 표시될 수 있고, 연산 시 정확한 값을 얻을 수 없습니다. 약 9000조 정도의 값인데 일반적인 업무에서는 사용할 일이 없을 수 있으나, 금융이나 통계 등에서는 발생할 수 있는 수치입니다. 예를 들어 2018년 대한민국 국민순자산은 약 1경 5511조 7000억원으로 추산하고 있습니다(출처: 통계청 2018 국민대차대조표). 보도자료에서는 뒷자리 단위를 잘라서 "천억 단위"와 같은 식으로 사용하기 때문에 계산이 가능하지만, 실제 값을 다루어야 하는 경우에는 자바스크립트에서 제공하는 지원 범위보다 큰 값을 다루어야 합니다.

nexacro.Decimal 오브젝트는 24자리 숫자(9999해)까지 처리할 수 있습니다.

일부 웹브라우저에서 자바스크립트 내장 객체인 BigInt 오브젝트를 사용할 수 있습니다. BigInt 오브젝트와 nexacro.Decimal 오브젝트의 지원 범위는 아래 표를 참고하세요 (2019년 12월 기준)


IE8

IE9

IE10

IE11

Edge

Chrome

Safari

Firefox

Opera

nexacro.Decimal

O

O

O

O

O

O

O

O

O

BigInt

X

X

X

X

X

O

X

O

O

49.2Grid 컴포넌트에서 BIGDECIMAL 타입 사용하기

Dataset 오브젝트에서 컬럼 설정 시 type 값을 "BIGDECIMAL"로 지정하고 Dataset을 바인딩하면 설정된 값을 nexacro.Decimal 오브젝트로 처리합니다.

49.2.1예제

19자리 숫자값을 다른 type의 Dataset 컬럼에서 어떻게 다루는지 확인합니다. 데이터를 표시하는 방식과 합계를 표시하는 방식을 확인할 수 있습니다.

type이 INT인 경우에는 전혀 다른 값을 표시하고, FLOAT인 경우에는 근사값으로 표시합니다. BIGDECIMAL인 경우에만 입력한 값을 정확하게 표시하고 합계값도 원하는 값을 반환합니다.

sample_nexacro_decimal_01.xfdl

49.2.2예제에서 사용한 핵심 기능

getSum

컬럼 ID 값을 지정해 합계값을 반환합니다.

49.2.3예제 구현 방법

1

Grid 컴포넌트를 화면에 배치합니다.

2

Dataset 오브젝트를 추가하고 아래와 같이 컬럼 형식과 데이터를 설정합니다.

3개의 컬럼을 추가하고 각 컬럼 type은 INT, FLOAT, BIGDECIMAL로 설정합니다. 데이터는 19자리 숫자값을 같은 값으로 지정합니다.

3

Dataset 오브젝트를 Grid 컴포넌트에 바인딩합니다.

4

Grid Contents Editor를 실행하고 Summary Row를 추가합니다.

5

Summary Row의 셀 속성 중에서 displaytype 속성값을 "number"로 설정하고 expr 속성값은 "dataset.getSum('[Column name]')"으로 설정합니다.

6

QuickView(Ctrl + F6)로 실행한 후 Dataset 오브젝트의 type에 따라 값이 어떻게 표시되는지 확인합니다.

49.31경(京)보다 큰 값 연산하기

nexacro.Decimal 오브젝트는 숫자가 아닌 오브젝트 형태로 처리합니다. 때문에 일반적인 연산기호를 사용할 수 없으며 연산을 처리하기 위한 별도의 메소드나 속성을 지원합니다.

49.3.1예제

Edit 컴포넌트에 숫자를 입력하고 연산자를 선택한 후 [Calculate] 버튼을 클릭하면 연산을 처리합니다.

입력값 또는 연산결과값이 24자리 숫자보다 큰 경우에는 정상적으로 연산 처리가 되지 않습니다.

sample_nexacro_decimal_02.xfdl

49.3.2예제에서 사용한 핵심 기능

addDecimal, subDecimal, mulDecimal, divDecimal

nexacro.Decimal 오브젝트 연산을 위한 메소드입니다. 연산 결과값을 반환하지 않고 메소드를 실행한 nexacro.Decimal 오브젝트에 연산 결과값이 반영됩니다.

49.3.3예제 구현 방법

1

Edit, Radio, Button 컴포넌트를 화면에 배치합니다.

2

Radio 컴포넌트의 innerdataset 값으로 add, sub, mul, div 값을 설정합니다.

3

Button 컴포넌트의 onclick 이벤트 함수를 아래와 같이 작성합니다.

this.Button00_onclick = function(obj:nexacro.Button,e:nexacro.ClickEventInfo)
{
    var a = nexacro.Decimal(this.Edit00.value.toString());
    var b = nexacro.Decimal(this.Edit01.value.toString());
    
    switch(this.Radio00.value) {
    case 'add':
        a.addDecimal(b);
        break;
    case 'sub':
        a.subDecimal(b);
        break;
    case 'mul':
        a.mulDecimal(b);
        break;
    case 'div':
        a.divDecimal(b);
        break;        
    default:
    }
    
    this.Edit02.set_value(a.toString());
};

Decimal 오브젝트 설정 시에는 문자열 형태로 값을 지정해주어야 합니다.

(O) var a = nexacro.Decimal(this.Edit00.value.toString());
(X) var a = nexacro.Decimal(this.Edit00.value.toNumber());
(O) var a = nexacro.Decimal("1234567890123456789");
(X) var a = nexacro.Decimal(1234567890123456789);

연산 처리된 값을 출력하는 경우에도 문자열로 바꾸어서 출력해주어야 합니다. Edit 컴포넌트의 value 값으로 설정한 경우에는 내부 처리 시 문자열로 변환해주기 때문에 오류는 발생하지 않지만, 문자열로 바꾸어서 처리해주는 것이 안전합니다.

(O) this.Edit02.set_value(a.toString());
(Δ) this.Edit02.set_value(a);

4

QuickView(Ctrl + F6)로 실행한 후 입력값의 연산이 처리되는지 확인합니다.