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.
|
* 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 {
|
class CharJVMTest {
|
||||||
|
|
||||||
@Test fun getCategory() {
|
@Test
|
||||||
|
fun getCategory() {
|
||||||
assertEquals(CharCategory.DECIMAL_DIGIT_NUMBER, '7'.category)
|
assertEquals(CharCategory.DECIMAL_DIGIT_NUMBER, '7'.category)
|
||||||
assertEquals(CharCategory.CURRENCY_SYMBOL, '$'.category)
|
assertEquals(CharCategory.CURRENCY_SYMBOL, '$'.category)
|
||||||
assertEquals(CharCategory.LOWERCASE_LETTER, 'a'.category)
|
assertEquals(CharCategory.LOWERCASE_LETTER, 'a'.category)
|
||||||
@@ -18,4 +19,16 @@ class CharJVMTest {
|
|||||||
assertTrue(',' in CharCategory.OTHER_PUNCTUATION)
|
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")
|
@SinceKotlin("1.5")
|
||||||
@WasExperimental(ExperimentalStdlibApi::class)
|
@WasExperimental(ExperimentalStdlibApi::class)
|
||||||
public fun Char.digitToInt(): Int {
|
public fun Char.digitToInt(): Int {
|
||||||
// TODO: needs to support all digits in JVM
|
return digitOf(this, 10).also {
|
||||||
if (this in '0'..'9') {
|
if (it < 0) throw IllegalArgumentException("Char $this is not a decimal digit")
|
||||||
return this - '0'
|
|
||||||
}
|
}
|
||||||
throw IllegalArgumentException("Char $this is not a decimal digit")
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -56,11 +54,7 @@ public fun Char.digitToInt(radix: Int): Int {
|
|||||||
@SinceKotlin("1.5")
|
@SinceKotlin("1.5")
|
||||||
@WasExperimental(ExperimentalStdlibApi::class)
|
@WasExperimental(ExperimentalStdlibApi::class)
|
||||||
public fun Char.digitToIntOrNull(): Int? {
|
public fun Char.digitToIntOrNull(): Int? {
|
||||||
// TODO: needs to support all digits in JVM
|
return digitOf(this, 10).takeIf { it >= 0 }
|
||||||
if (this in '0'..'9') {
|
|
||||||
return this - '0'
|
|
||||||
}
|
|
||||||
return null
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -77,17 +71,8 @@ public fun Char.digitToIntOrNull(): Int? {
|
|||||||
@SinceKotlin("1.5")
|
@SinceKotlin("1.5")
|
||||||
@WasExperimental(ExperimentalStdlibApi::class)
|
@WasExperimental(ExperimentalStdlibApi::class)
|
||||||
public fun Char.digitToIntOrNull(radix: Int): Int? {
|
public fun Char.digitToIntOrNull(radix: Int): Int? {
|
||||||
// TODO: needs to support all digits in JVM
|
checkRadix(radix)
|
||||||
if (radix !in 2..36) {
|
return digitOf(this, radix).takeIf { it >= 0 }
|
||||||
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
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|||||||
Reference in New Issue
Block a user