Support all digit chars in digitToInt on JVM KT-23451
This commit is contained in:
@@ -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")
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
@@ -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 }
|
||||
}
|
||||
|
||||
/**
|
||||
|
||||
Reference in New Issue
Block a user