Cuenta el número de dígitos en Kotlin

Actualmente estoy contando el número de dígitos usando un enfoque simple de string.length:

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

Me pregunto si esta es una buena manera o hay una forma más apropiada de hacerlo en Kotlin.

Puede usar la biblioteca Java-math estándar en java.lang.Math . La function log10 le dará la longitud del número less 1 (con algunas excepciones). Sin embargo, esta function funciona con dobles, por lo que tienes que convertir de ida y vuelta.

Una function de length podría escribirse así en Kotlin:

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

Entonces puedes llamarlo así:

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

Si por algún motivo no desea recurrir a cadenas o dobles, puede usar la búsqueda binaria en una matriz de integers:

 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 } 

Por supuesto, puede codificar la búsqueda binaria para este caso de uso específico si quiere que sea realmente eficiente, y / o le pagan por líneas de código:

 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 } } } } } 

De cualquier manera, asegúrese de tener todos los casos de límite correctos:

 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)) } } 

Todo esto supone que no te importan los integers negativos. Si lo hace, y tiene problemas para adaptar el código, no dude en pedir ayuda.

  • Advertencia de Kotlin: el resultado de la twig condicional del tipo ... es el molde de implicidad de Any?
  • Kotlin, networkinguce el código duplicado
  • Crea controles dinámicamente en Android usando Kotlin
  • El complemento kapt no funciona con gradle-script-kotlin
  • Carga GIF usando la versión 4.2.0 de deslizamiento en Kotlin
  • Android: no se puede agregar el jar creado en java8 con kotlin
  • ¿Cómo sobrescribir el método al crear instancias de objects en Kotlin?
  • Pasar datos a un BroadcastReceiver desde un PendingIntent (AlarmManager)
  • ¿Qué es la configuration de generateStubs en Kotlin?
  • Intellij IDEA Kotlin Android Theme.AppCompat No se encontraron resources
  • ¿Cómo puedo configurar el layoutmanager en RecycleView usando kotlin?