Количество цифр в Котлине

Я сейчас подсчитываю количество цифр, используя простой метод string.length:

val number = 829 val length = number.toString().length 

Интересно, хорошо ли это, или есть более подходящий способ сделать это в Котлине.

Вы можете использовать стандартную Java-математическую библиотеку в java.lang.Math . Функция log10 даст вам длину числа минус 1 (за некоторыми исключениями). Эта функция работает с удвоениями, поэтому вам нужно конвертировать туда и обратно.

Функция length может быть написана так в Котлине:

 fun Int.length() = when(this) { 0 -> 1 else -> Math.log10(Math.abs(toDouble())).toInt() + 1 } 

Затем вы можете вызвать его так:

 println(829.length()) // Prints 3 println(-1234.length()) // Prints 4 (it disregards the minus sign) 

Если по какой-то причине вы не хотите прибегать к строкам или удвоениям, вы можете использовать бинарный поиск по массиву целых чисел:

 private val limits = arrayOf(-1, 9, 99, 999, 9999, 99999, 999999, 9999999, 99999999, 999999999) fun countDigits(x: Int): Int { assert(x >= 0) val result = limits.binarySearch(x) return result.xor(result.shr(31)) // one's complement absolute value } 

Конечно, вы можете выполнить двоичный поиск жесткого кода для этого конкретного варианта использования, если вы хотите, чтобы он был действительно эффективным и / или вам заплатили строки кода:

 fun countDigits(x: Int): Int { assert(x >= 0) if (x <= 99999) { if (x <= 99) { if (x <= 9) { return 1 } else { return 2 } } else { if (x <= 999) { return 3 } else { if (x <= 9999) { return 4 } else { return 5 } } } } else { if (x <= 9999999) { if (x <= 999999) { return 6 } else { return 7 } } else { if (x <= 99999999) { return 8 } else { if (x <= 999999999) { return 9 } else { return 10 } } } } } 

В любом случае, убедитесь, что вы получили все эти граничные случаи:

 class CountDigitsTest { @Test fun oneDigit() { assertEquals(1, countDigits(0)) assertEquals(1, countDigits(9)) } @Test fun twoDigits() { assertEquals(2, countDigits(10)) assertEquals(2, countDigits(99)) } @Test fun threeDigits() { assertEquals(3, countDigits(100)) assertEquals(3, countDigits(999)) } @Test fun fourDigits() { assertEquals(4, countDigits(1000)) assertEquals(4, countDigits(9999)) } @Test fun fiveDigits() { assertEquals(5, countDigits(10000)) assertEquals(5, countDigits(99999)) } @Test fun sixDigits() { assertEquals(6, countDigits(100000)) assertEquals(6, countDigits(999999)) } @Test fun sevenDigits() { assertEquals(7, countDigits(1000000)) assertEquals(7, countDigits(9999999)) } @Test fun eightDigits() { assertEquals(8, countDigits(10000000)) assertEquals(8, countDigits(99999999)) } @Test fun nineDigits() { assertEquals(9, countDigits(100000000)) assertEquals(9, countDigits(999999999)) } @Test fun tenDigits() { assertEquals(10, countDigits(1000000000)) assertEquals(10, countDigits(Int.MAX_VALUE)) } } 

Все это предполагает, что вас не интересуют отрицательные целые числа. Если вы это сделаете, и вам не удается адаптировать код, не стесняйтесь обращаться за помощью.