NGMsoftware

NGMsoftware
로그인 회원가입
  • 매뉴얼
  • 학습
  • 매뉴얼

    학습


    C# C# .NET 매크로 프로그램 만들기. (사칙 연산)

    페이지 정보

    본문

    안녕하세요. 엔지엠소프트웨어입니다. 간단하게 사칙연산에 대해서 알아보겠습니다. 엔지엠 6에도 있는 액션인데요. 당시에 너무 복잡하게 만들어서 많이 사용하지는 않는 액션이 되어 버렸습니다. 엔지엠 7에서는 동일한 기능을 제공하지만, 사용성 편의성을 대폭 개선했습니다. 사칙연산의 값들을 숫자 형식을 사용하면 범용성이 많이 떨어집니다. 그래서, 연산에 필요한 값들을 모두 문자열 형식으로 변경하고, 내부에서 값 유효성을 체크하는 방향으로 변경되었습니다.

     

    이전 시간에 알아본 문자열 연결과 비슷합니다. 문제를 해결하는데 핵심 요소는 플레이스홀더입니다. OperationModel을 추가해주고, 아래와 같이 속성을 만들어줍니다.

    ynBp2AM.jpeg

     

     

    속성은 4개입니다. 연산자를 입력하는 오퍼레이터와 변수로 처리할 수 있도록 해주는 변수 목록이 있습니다. 그리고, 사칙연산은 나누기도 처리할 수 있기 때문에 소수점 처리가 필요할수도 있습니다. 그래서, 소수점 자리수 표시와 몇번째 소수점 자리에서 반올림, 올림, 내림을 할건지도 선택해야 합니다.

    fQbE73Z.jpeg

     

    변수로부터 데이터를 받아올수도 있기 때문에 아래와 같이 플레이스홀더를 먼저 처리해줘야 합니다.

    var leftValue = Ai.Common.Helper.GetMatches(player, this.GetType().GetProperty(nameof(LeftValue)), LeftValue);
    var rightValue = Ai.Common.Helper.GetMatches(player, this.GetType().GetProperty(nameof(RightValue)), RightValue);
    var op = Ai.Common.Helper.GetMatches(player, this.GetType().GetProperty(nameof(Operator)), Operator);

     

    여러가지 시나리오를 모두 체크할수는 없기 때문에 왼쪽 값이 없으면 변수로부터 값을 가져오는건 무조건 하나라도 존재해야 합니다.

    if (!Ai.Common.Helper.NullCheckAndWriteLine(player, nameof(leftValue), leftValue) && Variables == null && Variables.Length > 0)
        return id;

     

    데이타테이블의 컴퓨트를 사용해서 문자열을 계산할 수 있습니다.

    var result = double.Parse(new DataTable().Compute(exp, null).ToString());

     

    소수점과 반올림 처리는 아래처럼 간단하게 코딩 몇줄로 만들 수 있습니다.

    if (DecimalPlaces > -1)
        result = double.Parse(result.ToString($"N{DecimalPlaces}"));
    
    switch (FormulaRound)
    {
        case Definition.RoundType.Round:
            result = System.Math.Round(result, DecimalPlaces);
            break;
        case Definition.RoundType.RoundUp:
            var dp = int.Parse("1".PadRight(DecimalPlaces, '0'));
            result = System.Math.Ceiling(result * dp) / dp;
            break;
        case Definition.RoundType.RoundDown:
            dp = int.Parse("1".PadRight(DecimalPlaces, '0'));
            result = System.Math.Truncate(result * dp) / dp;
            break;
    }

     

    스크립트는 아래와 같이 변수와 사칙연산으로 구성할 수 있습니다.

    Gi0zjJS.jpeg

     

     

    변수는 10과 3입니다. 사칙연산은 10/3이기 때문에 소수점 자리까지 모두 표시될건데요. 표시할 자리수는 9자리고, 라운드 옵션은 올림입니다.

    c2XoyuK.jpeg

     

     

    매크로를 실행하면 결과 값은 소수점 9자리에서 올림되어 8자리가 4가 됩니다.

    kspv18f.jpeg

     

     

    개발자에게 후원하기

    MGtdv7r.png

     

    추천, 구독, 홍보 꼭~ 부탁드립니다.

    여러분의 후원이 빠른 귀농을 가능하게 해줍니다~ 답답한 도시를 벗어나 귀농하고 싶은 개발자~

    감사합니다~

    • 네이버 공유하기
    • 페이스북 공유하기
    • 트위터 공유하기
    • 카카오스토리 공유하기
    추천0 비추천0

    댓글목록

    등록된 댓글이 없습니다.