JS stdlib: implement String.compareTo with ignoreCase
#KT-18067 Fixed
This commit is contained in:
committed by
Ilya Gorbunov
parent
d194893012
commit
f05a19aafb
@@ -290,6 +290,11 @@ expect fun Int.toString(radix: Int): String
|
|||||||
@SinceKotlin("1.2")
|
@SinceKotlin("1.2")
|
||||||
expect fun Long.toString(radix: Int): String
|
expect fun Long.toString(radix: Int): String
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Compares two strings lexicographically, optionally ignoring case differences.
|
||||||
|
*/
|
||||||
|
expect fun String.compareTo(other: String, ignoreCase: Boolean = false): Int
|
||||||
|
|
||||||
@PublishedApi
|
@PublishedApi
|
||||||
internal expect fun checkRadix(radix: Int): Int
|
internal expect fun checkRadix(radix: Int): Int
|
||||||
|
|
||||||
|
|||||||
@@ -73,3 +73,34 @@ public inline val CharSequence.size: Int get() = length
|
|||||||
|
|
||||||
@kotlin.internal.InlineOnly
|
@kotlin.internal.InlineOnly
|
||||||
internal inline fun String.nativeReplace(pattern: RegExp, replacement: String): String = asDynamic().replace(pattern, replacement)
|
internal inline fun String.nativeReplace(pattern: RegExp, replacement: String): String = asDynamic().replace(pattern, replacement)
|
||||||
|
|
||||||
|
public actual fun String.compareTo(other: String, ignoreCase: Boolean): Int {
|
||||||
|
if (ignoreCase) {
|
||||||
|
val n1 = this.length
|
||||||
|
val n2 = other.length
|
||||||
|
val min = minOf(n1, n2)
|
||||||
|
if (min == 0) return n1 - n2
|
||||||
|
var start = 0
|
||||||
|
while (true) {
|
||||||
|
val end = minOf(start + 16, min)
|
||||||
|
var s1 = this.substring(start, end)
|
||||||
|
var s2 = other.substring(start, end)
|
||||||
|
if (s1 != s2) {
|
||||||
|
s1 = s1.toUpperCase()
|
||||||
|
s2 = s2.toUpperCase()
|
||||||
|
if (s1 != s2) {
|
||||||
|
s1 = s1.toLowerCase()
|
||||||
|
s2 = s2.toLowerCase()
|
||||||
|
if (s1 != s2) {
|
||||||
|
return s1.compareTo(s2)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (end == min) break
|
||||||
|
start = end
|
||||||
|
}
|
||||||
|
return n1 - n2
|
||||||
|
} else {
|
||||||
|
return compareTo(other)
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -317,7 +317,7 @@ public inline fun String.codePointCount(beginIndex: Int, endIndex: Int): Int =
|
|||||||
/**
|
/**
|
||||||
* Compares two strings lexicographically, optionally ignoring case differences.
|
* Compares two strings lexicographically, optionally ignoring case differences.
|
||||||
*/
|
*/
|
||||||
public fun String.compareTo(other: String, ignoreCase: Boolean = false): Int {
|
public actual fun String.compareTo(other: String, ignoreCase: Boolean): Int {
|
||||||
if (ignoreCase)
|
if (ignoreCase)
|
||||||
return (this as java.lang.String).compareToIgnoreCase(other)
|
return (this as java.lang.String).compareToIgnoreCase(other)
|
||||||
else
|
else
|
||||||
|
|||||||
@@ -1336,4 +1336,29 @@ ${" "}
|
|||||||
assertEquals(" ABC\n \n 123", "ABC\n \n123".prependIndent(" "))
|
assertEquals(" ABC\n \n 123", "ABC\n \n123".prependIndent(" "))
|
||||||
assertEquals(" ", "".prependIndent(" "))
|
assertEquals(" ", "".prependIndent(" "))
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Test fun testCompareToIgnoreCase() {
|
||||||
|
assertTrue("ABC".compareTo("ABC", ignoreCase = false) == 0)
|
||||||
|
assertTrue("ABC".compareTo("ABc", ignoreCase = false) < 0)
|
||||||
|
assertTrue("ABc".compareTo("ABC", ignoreCase = false) > 0)
|
||||||
|
assertTrue("ABC".compareTo("ABx", ignoreCase = false) < 0)
|
||||||
|
assertTrue("ABx".compareTo("ABC", ignoreCase = false) > 0)
|
||||||
|
assertTrue("[".compareTo("aa", ignoreCase = false) < 0)
|
||||||
|
assertTrue("".compareTo("", ignoreCase = false) == 0)
|
||||||
|
assertTrue("".compareTo("A", ignoreCase = false) < 0)
|
||||||
|
assertTrue("A".compareTo("", ignoreCase = false) > 0)
|
||||||
|
assertTrue(("A".repeat(16) + "B").compareTo("A".repeat(16) + "b", ignoreCase = false) < 0)
|
||||||
|
|
||||||
|
assertTrue("ABC".compareTo("ABC", ignoreCase = true) == 0)
|
||||||
|
assertTrue("ABC".compareTo("ABc", ignoreCase = true) == 0)
|
||||||
|
assertTrue("ABc".compareTo("ABC", ignoreCase = true) == 0)
|
||||||
|
assertTrue("ABC".compareTo("ABx", ignoreCase = true) < 0)
|
||||||
|
assertTrue("ABx".compareTo("ABC", ignoreCase = true) > 0)
|
||||||
|
assertTrue("[".compareTo("aa", ignoreCase = true) < 0)
|
||||||
|
assertTrue("".compareTo("", ignoreCase = false) == 0)
|
||||||
|
assertTrue("".compareTo("A", ignoreCase = false) < 0)
|
||||||
|
assertTrue("A".compareTo("", ignoreCase = false) > 0)
|
||||||
|
assertTrue(("A".repeat(16) + "B").compareTo("A".repeat(16) + "b", ignoreCase = false) < 0)
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user