반응형
1000 = 1A
1000000 = 1B
namespace GameUtils
{
public class BigNumberHelper
{
internal static readonly char[] MagnitudeUnits = new char[] { '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' };
private static string _numberFormat = "{0:F3}";
public static void Init(string format)
{
_numberFormat = format;
}
public static string BigNumberToString(BigNumber bigNumber)
{
if(bigNumber.Magnitude >=0)
{
return $"{string.Format(_numberFormat, bigNumber.Value)}{bigNumber.MagnitudeLabel}";
}
else
{
return bigNumber.Value.ToString();
}
}
}
}
using System;
using System.Text;
namespace GameUtils
{
public struct BigNumber
{
public double Value { get; private set; }
public int Magnitude { get; private set; }
public string MagnitudeLabel { get; private set; }
public string DisplayValue
{
get
{
if (string.IsNullOrEmpty(_displayValue))
{
BigNumberHelper.BigNumberToString(this);
}
return _displayValue;
}
}
private readonly string _displayValue;
public BigNumber(double value) : this(value, -1)
{
}
public BigNumber(double value, int digit = -1)
{
while (value >= 1000)
{
value /= 1000;
digit++;
}
Magnitude = digit;
Value = value;
var sb = new StringBuilder();
while (digit >= 0)
{
sb.Insert(0, BigNumberHelper.MagnitudeUnits[digit % BigNumberHelper.MagnitudeUnits.Length]);
digit = digit / BigNumberHelper.MagnitudeUnits.Length - 1;
}
MagnitudeLabel = sb.ToString();
_displayValue = string.Empty;
}
public static BigNumber operator +(BigNumber number1, BigNumber number2)
{
double convertedValue1 = number1.Value;
double convertedValue2 = number2.Value;
int finalMagnitude = number1.Magnitude;
if (number1.Magnitude > number2.Magnitude)
{
for (int i = 0; i < (number1.Magnitude - number2.Magnitude); i++)
{
convertedValue2 /= 1000;
}
}
else if (number1.Magnitude < number2.Magnitude)
{
for (int i = 0; i < (number2.Magnitude - number1.Magnitude); i++)
{
convertedValue1 /= 1000;
}
finalMagnitude = number2.Magnitude;
}
var value = convertedValue1 + convertedValue2;
return new BigNumber(value, finalMagnitude);
}
public static BigNumber operator -(BigNumber number1, BigNumber number2)
{
double convertedValue1 = number1.Value;
double convertedValue2 = number2.Value;
int finalMagnitude = number1.Magnitude;
if (number1.Magnitude > number2.Magnitude)
{
for (int i = 0; i < (number1.Magnitude - number2.Magnitude); i++)
{
convertedValue2 /= 1000;
}
}
else if (number1.Magnitude < number2.Magnitude)
{
for (int i = 0; i < (number2.Magnitude - number1.Magnitude); i++)
{
convertedValue1 /= 1000;
}
finalMagnitude = number2.Magnitude;
}
var value = convertedValue1 - convertedValue2;
if (Math.Abs(value) < 1)
{
value *= 1000;
finalMagnitude--;
}
return new BigNumber(value, finalMagnitude);
}
}
}
반응형
'개발관련 > Unity' 카테고리의 다른 글
해상도 고정 (0) | 2023.09.02 |
---|---|
TextMeshPro 폰트 생성 (0) | 2023.07.31 |
Addressables 동기 사용법 및 주의점 (0) | 2022.09.12 |
곡사체 관련 공식 (0) | 2021.03.20 |
could not create asset from file could not be read (0) | 2021.01.06 |