BigInteger: интегральная константа слишком велика - PullRequest
0 голосов
/ 20 июня 2020

Я хочу разбить значение BigInteger (111111222222333333444444555555) на массив из 5 элементов (в основном разбивая большое количество на разные монеты). Они разделяются обратным отсчетом и подстрокой каждые 6 чисел. Я строю это для игры на единство. Это означает, что тестовый массив после запуска функции должен быть массивом {111111,222222,333333,444444,555555}.

В моем тесте я вызываю ToRegularCoins(111111222222333333444444555555, test);, где test - массив int [5] .

Функция выглядит следующим образом:

public void ToRegularCoins(BigInteger coinsValue, int[] targetArray)
{
    string coinsValueString = coinsValue.ToString();
    string[] coinsValueStringArray = new string[5];

    for (int i = 0; i < 5; i++)
    {
        try
        {
            coinsValueStringArray[i] = coinsValueString.Substring(coinsValueString.Length - 6);
            coinsValueString = coinsValueString.Remove(coinsValueString.Length - 6, 6);
            Debug.Log("Index: " + i + "coinsValueString: " + coinsValueString);
        }
        catch(ArgumentOutOfRangeException)
        {
            Debug.Log("Exception in Index: " + i);
            coinsValueStringArray[i] = coinsValueString;
            coinsValueString = "";
        }
        try
        {
            targetArray[i] = int.Parse(coinsValueStringArray[i]); // Turn string into Int at Array's index
        }
        catch(FormatException)
        {
            Debug.Log("No Coins of Index: " + i);
        }
    }
}

Запуская мой скрипт, я получаю XY.cs (32,24): error CS1021: Integral constant is too big

Как исправить эту ошибку? Может быть, я делаю это сложнее, чем следовало бы?

Ответы [ 2 ]

3 голосов
/ 20 июня 2020

Объявите переменную следующим образом.

var coinsValue = BigInteger.Parse("111111222222333333444444555555");
2 голосов
/ 20 июня 2020

Если вы внимательно посмотрите на свой код, ваша первая строка функции ToRegularCoins() преобразует BigInteger в string, поэтому вместо синтаксического анализа значения в BigInteger вы можете напрямую передать строку ToRegularCoins() функции

//Replace coinValue to coinValueString.
public void ToRegularCoins(string coinsValueString, int[] targetArray)
{
   //No need to convert input parameter to string, as it is already in string format
    string[] coinsValueStringArray = new string[5];

    for (int i = 0; i < 5; i++)
    {
        try
        {
            coinsValueStringArray[i] = coinsValueString.Substring(coinsValueString.Length - 6);
            coinsValueString = coinsValueString.Remove(coinsValueString.Length - 6, 6);
            Debug.Log("Index: " + i + "coinsValueString: " + coinsValueString);
        }
        catch(ArgumentOutOfRangeException)
        {
            Debug.Log("Exception in Index: " + i);
            coinsValueStringArray[i] = coinsValueString;
            coinsValueString = "";
        }
        try
        {
            targetArray[i] = int.Parse(coinsValueStringArray[i]); // Turn string into Int at Array's index
        }
        catch(FormatException)
        {
            Debug.Log("No Coins of Index: " + i);
        }
    }
}

Когда вы вызываете свой метод, передайте string вместо BigInteger.

ToRegularCoins("111111222222333333444444555555", test);
...