반응형
클리커류의 게임을 많이 해봤을 것이다.
그런류의 게임을 보면 1,000단위, 10,000,000 단위 등 억,조,경 이상의 단위를 사용하는 경우가 있다.
그런데 표현을 보면 1a, 2aa, 2.5ab 등으로 문자로 단위를 표기하는 것도 본 적이 있을 것이다.
나도 용사는 직진중 이라는 게임을 만들때 헤아릴 수 없는 단위로 올라갈 경우 a, b, c, aa, ab 등의 단위를 사용하여 표현해 주었다.
정수형으로는 표현해줄 수 없으며 Double 형을 조금 변경해서 사용하면 가능하다.
약 소수점 300개 정도까지 가능하며, 단위로는 a 부터 cx 단위까지 사용이 가능하다.
각 단위가 올라가는 조건은 000이 3개. 즉 1,000단위로 단위가 변경된다고 보면된다.
차후에도 이런 표현방법을 사용할 수 있기에 기록용으로 남겨 둔다.
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)
{
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;
// 나머지는 정수부 자릿수 계산에 사용(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);
}
반응형
'Program Tip' 카테고리의 다른 글
Unity 2021.3.15f Google Play Game Service Plug-ins 연동 오류 수정(기록용) (0) | 2023.01.09 |
---|---|
Unity 2021.3.15f 버전에서 UnityAds 4.4.1 버전을 추가할 시 발생하는 오류 수정 방법(기록용) (0) | 2023.01.06 |
Unity에서 유용하게 사용될 오브젝트 풀링(Object Pooling) (0) | 2022.01.11 |
정수로 표현하지 못하는 큰수를 더하기 (0) | 2017.11.07 |
[Unity3D] Vector2 에서 Vector2 사이의 사이각 찾기 (3) | 2015.12.18 |