Как получить максимальное количество определенной длины

У меня есть номер, например 1234567897865; как я могу максимизировать его и создать 99999999999999?

Я сделал это следующим образом:

        int len = ItemNo.ToString().Length;
        String maxNumString = "";

        for (int i = 0; i < len; i++)
        {
            maxNumString += "9";
        }

        long maxNumber = long.Parse(maxNumString);

Какой будет лучший, правильный и более короткий способ подхода к этой задаче?

Ответ 1

var x = 1234567897865;  
return Math.Pow(10, Math.Ceiling(Math.Log10(x+1e-6))) - 1;

Чтобы расширить приведенные ниже комментарии, если эта проблема была выражена в шестнадцатеричной или двоичной форме, ее можно было бы сделать очень просто с помощью операторов сдвига

i.e., "У меня есть число в шестнадцатеричном формате, например, 3A67FD5C, как я могу его максимизировать и создавать FFFFFFFF?"

Мне нужно будет сыграть с этим, чтобы убедиться, что он работает точно, но это было бы примерно так:

var x = 0x3A67FD5C;  
var p = 0;
while((x=x>>1)>0) p++;          // count how many binary values are in the number
  return (1L << 4*(1+p/4)) - 1; // using left shift, generate 2 to 
                                // that power and subtract one

Ответ 2

long maxNumber = long.Parse(new String('9', ItemNo.ToString().Length));

Ответ 3

Попробуйте следующее:

int v = 1;
do {
    v = v * 10;
} while (v <= number);
return v - 1;

Ответ 4

int numDigits = (int)Math.Ceiling(Math.Log10(number));
int result = (int)(Math.Pow(10, numDigits) - 1)

У меня нет компилятора, доступного на данный момент, поэтому здесь могут потребоваться некоторые дополнительные преобразования строк/двойников.