From 256f634e618a84fe8589060101ae3e83be7837dc Mon Sep 17 00:00:00 2001 From: Ilya Gorbunov Date: Sat, 3 Apr 2021 00:07:48 +0300 Subject: [PATCH] Support all digit chars in digitToInt on JVM KT-23451 --- libraries/stdlib/jvm/test/text/CharJVMTest.kt | 17 +++++++++++-- libraries/stdlib/src/kotlin/text/Char.kt | 25 ++++--------------- 2 files changed, 20 insertions(+), 22 deletions(-) diff --git a/libraries/stdlib/jvm/test/text/CharJVMTest.kt b/libraries/stdlib/jvm/test/text/CharJVMTest.kt index f99d4cc31aa..cb397c3d46a 100644 --- a/libraries/stdlib/jvm/test/text/CharJVMTest.kt +++ b/libraries/stdlib/jvm/test/text/CharJVMTest.kt @@ -1,5 +1,5 @@ /* - * Copyright 2010-2018 JetBrains s.r.o. and Kotlin Programming Language contributors. + * Copyright 2010-2021 JetBrains s.r.o. and Kotlin Programming Language contributors. * Use of this source code is governed by the Apache 2.0 license that can be found in the license/LICENSE.txt file. */ @@ -9,7 +9,8 @@ import kotlin.test.* class CharJVMTest { - @Test fun getCategory() { + @Test + fun getCategory() { assertEquals(CharCategory.DECIMAL_DIGIT_NUMBER, '7'.category) assertEquals(CharCategory.CURRENCY_SYMBOL, '$'.category) assertEquals(CharCategory.LOWERCASE_LETTER, 'a'.category) @@ -18,4 +19,16 @@ class CharJVMTest { assertTrue(',' in CharCategory.OTHER_PUNCTUATION) } + @Test + fun nonAsciiDigitsToInt() { + val allDigits = (Char.MIN_VALUE..Char.MAX_VALUE).filter { it.isDigit() } + val radixes = listOf(10, 16, 36) + allDigits.forEach { c -> + assertEquals(Character.digit(c, 10), c.digitToInt(), "$c") + for (radix in radixes) { + assertEquals(Character.digit(c, radix), c.digitToInt(radix), "$c") + } + } + } + } \ No newline at end of file diff --git a/libraries/stdlib/src/kotlin/text/Char.kt b/libraries/stdlib/src/kotlin/text/Char.kt index 806a61204fa..beedd544072 100644 --- a/libraries/stdlib/src/kotlin/text/Char.kt +++ b/libraries/stdlib/src/kotlin/text/Char.kt @@ -20,11 +20,9 @@ package kotlin.text @SinceKotlin("1.5") @WasExperimental(ExperimentalStdlibApi::class) public fun Char.digitToInt(): Int { - // TODO: needs to support all digits in JVM - if (this in '0'..'9') { - return this - '0' + return digitOf(this, 10).also { + if (it < 0) throw IllegalArgumentException("Char $this is not a decimal digit") } - throw IllegalArgumentException("Char $this is not a decimal digit") } /** @@ -56,11 +54,7 @@ public fun Char.digitToInt(radix: Int): Int { @SinceKotlin("1.5") @WasExperimental(ExperimentalStdlibApi::class) public fun Char.digitToIntOrNull(): Int? { - // TODO: needs to support all digits in JVM - if (this in '0'..'9') { - return this - '0' - } - return null + return digitOf(this, 10).takeIf { it >= 0 } } /** @@ -77,17 +71,8 @@ public fun Char.digitToIntOrNull(): Int? { @SinceKotlin("1.5") @WasExperimental(ExperimentalStdlibApi::class) public fun Char.digitToIntOrNull(radix: Int): Int? { - // TODO: needs to support all digits in JVM - if (radix !in 2..36) { - throw IllegalArgumentException("Invalid radix: $radix. Valid radix values are in range 2..36") - } - if (this in '0'..'9') { - val digit = this - '0' - return if (digit < radix) digit else null - } - val a = if (this <= 'Z') 'A' else 'a' - val digit = 10 + (this - a) - return if (digit in 10 until radix) digit else null + checkRadix(radix) + return digitOf(this, radix).takeIf { it >= 0 } } /**