Support all digit chars in digitToInt on JVM KT-23451

This commit is contained in:
Ilya Gorbunov
2021-04-03 00:07:48 +03:00
parent 8b85bae020
commit 256f634e61
2 changed files with 20 additions and 22 deletions
+15 -2
View File
@@ -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")
}
}
}
}
+5 -20
View File
@@ -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 }
}
/**