nexacro.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 |
Grid 컴포넌트에서 BIGDECIMAL 타입 사용하기
Dataset 오브젝트에서 컬럼 설정 시 type 값을 "BIGDECIMAL"로 지정하고 Dataset을 바인딩하면 설정된 값을 nexacro.Decimal 오브젝트로 처리합니다.
예제
19자리 숫자값을 다른 type의 Dataset 컬럼에서 어떻게 다루는지 확인합니다. 데이터를 표시하는 방식과 합계를 표시하는 방식을 확인할 수 있습니다.
type이 INT인 경우에는 전혀 다른 값을 표시하고, FLOAT인 경우에는 근사값으로 표시합니다. BIGDECIMAL인 경우에만 입력한 값을 정확하게 표시하고 합계값도 원하는 값을 반환합니다.
sample_nexacro_decimal_01.xfdl
예제에서 사용한 핵심 기능
- getSum
컬럼 ID 값을 지정해 합계값을 반환합니다.
예제 구현 방법
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에 따라 값이 어떻게 표시되는지 확인합니다.
1경(京)보다 큰 값 연산하기
nexacro.Decimal 오브젝트는 숫자가 아닌 오브젝트 형태로 처리합니다. 때문에 일반적인 연산기호를 사용할 수 없으며 연산을 처리하기 위한 별도의 메소드나 속성을 지원합니다.
예제
Edit 컴포넌트에 숫자를 입력하고 연산자를 선택한 후 [Calculate] 버튼을 클릭하면 연산을 처리합니다.
입력값 또는 연산결과값이 24자리 숫자보다 큰 경우에는 정상적으로 연산 처리가 되지 않습니다.
sample_nexacro_decimal_02.xfdl
예제에서 사용한 핵심 기능
- addDecimal, subDecimal, mulDecimal, divDecimal
nexacro.Decimal 오브젝트 연산을 위한 메소드입니다. 연산 결과값을 반환하지 않고 메소드를 실행한 nexacro.Decimal 오브젝트에 연산 결과값이 반영됩니다.
예제 구현 방법
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)로 실행한 후 입력값의 연산이 처리되는지 확인합니다.