방치형 게임 화폐 단위 표현 (지수 표현식)

박지예·2023년 11월 21일
0

공부

목록 보기
38/42
post-custom-banner

화폐 단위 표현 (지수 표현식)

방치형 게임을 보면 화폐 단위가 1A, 1AA, 2.5AB 등 문자로 표현된다.

여기서 우리가 먼저 알고 가야하는 개념은 지수 표현식 이다.

지수 표현식

지수 표기법은 10의 배수가 사용될 경우 모두 표시하기 어렵기 때문에 지수(e)를 사용하여 표기를 하는 방식이다.

10만 (100,000)을 표시해보자. 10만은 1 * 10의 5제곱이기 때문에 e+5를 사용한다

1.0e+5

1억 (100,000,000)은 10의 8제곱이므로 1.0e+8 로 표시할 수 있다.

정규화 표기법 : 지수 표기법은 지수 값의 크기에 다라 무수히 많은 방법으로 표현이 가능하다. 그중 임의의 실수의 절대값을 1이상 10미만으로 설정하는 것을 정규화 표기법이라고 한다.

‘+’는 생략 가능하다

350 → 3.5e2

스크립트

위 지식들을 가지고 앞서 말했던 방치형 게임의 재화 표현 스크립트를 작성해보자.

static readonly string[] CurrencyUnits = new string[] { "", "a", "b", "c", "d", "e", "f", "g", "h", "i", "j", "k", "l", "m", "n", "o", "p", "q", "r", "s", "t", "u", "v", "w", "x", "y", "z", "aa", "ab", "ac", "ad", "ae", "af", "ag", "ah", "ai", "aj", "ak", "al", "am", "an", "ao", "ap", "aq", "ar", "as", "at", "au", "av", "aw", "ax", "ay", "az", "ba", "bb", "bc", "bd", "be", "bf", "bg", "bh", "bi", "bj", "bk", "bl", "bm", "bn", "bo", "bp", "bq", "br", "bs", "bt", "bu", "bv", "bw", "bx", "by", "bz", "ca", "cb", "cc", "cd", "ce", "cf", "cg", "ch", "ci", "cj", "ck", "cl", "cm", "cn", "co", "cp", "cq", "cr", "cs", "ct", "cu", "cv", "cw", "cx", };
	
    /// <summary>
    /// double 형 데이터를 클리커 게임의 화폐 단위로 표현
    /// </summary>
    /// <param name="number"></param>
    /// <returns></returns>
    public static string ToCurrencyString(this double number)
    {
        string zero = "0";

        if (-1d < number && number < 1d)  // 0일 때
        {
            return zero;
        }

        if (double.IsInfinity(number))   // 무한 일 때 
        {
            return "Infinity";
        }

        //  부호 출력 문자열
        string significant = (number < 0) ? "-" : string.Empty;

        //  보여줄 숫자
        string showNumber = string.Empty;

        //  단위 문자열
        string unityString = string.Empty;

        //  패턴을 단순화 시키기 위해 무조건 지수 표현식으로 변경한 후 처리
        string[] partsSplit = number.ToString("E").Split('+');

        //  예외
        if (partsSplit.Length < 2)
        {
            return zero;
        }

        //  지수 (자릿수 표현)
        if (!int.TryParse(partsSplit[1], out int exponent))  // 지수가 존재하는지
        {
            Debug.LogWarningFormat("Failed - ToCurrentString({0}) : partSplit[1] = {1}", number, partsSplit[1]);
            return zero;
        }

        //  몫은 문자열 인덱스
        int quotient = exponent / 3;   // 000이 3개 , 1000 단위로 값이 변경된다

        //  나머지는 정수부 자릿수 계산에 사용(10의 거듭제곱을 사용)
        int remainder = exponent % 3;

        //  1A 미만은 그냥 표현
        if (exponent < 3)
        {
            showNumber = System.Math.Truncate(number).ToString();
        }
        else
        {
            //  10의 거듭제곱을 구해서 자릿수 표현값을 만들어 준다.
            var temp = double.Parse(partsSplit[0].Replace("E", "")) * System.Math.Pow(10, remainder);

            //  소수 둘째자리까지만 출력한다.
            showNumber = temp.ToString("F").Replace(".00", "");
        }

        unityString = CurrencyUnits[quotient];
        
        return string.Format("{0}{1}{2}", significant, showNumber, unityString);
    }
출처: https://forestj.tistory.com/102 [포레스트제이의 일상:티스토리]

위 스크립트를 보면, 기존의 숫자를 지수 표현법으로 먼저 표기한다.
그리고 Split 함수를 사용해서 지수를 배열에 분리할 수 있다 ( 1번째 인덱스에 위치 )

1000 단위 (0이 3개)로 다음 문자열이 정해지기 때문에 3을 나눠준 값으로 문자열의 인덱스를 정한다.

3으로 나눈 나머지 값만큼 10을 제곱하여 문자열 앞에 붙는 수를 정한다. 이때 Replace 함수로 문자열 "E"를 제거해준다.

앞서 구한 부호와, 숫자, 문자열을 모두 더하면 완성!

profile
언젠간 바다로 갈거야!🐋
post-custom-banner

0개의 댓글