diff --git a/hutool-core/src/main/java/org/dromara/hutool/core/text/CharSequenceUtil.java b/hutool-core/src/main/java/org/dromara/hutool/core/text/CharSequenceUtil.java
index 15e4ac29a..af9617c45 100644
--- a/hutool-core/src/main/java/org/dromara/hutool/core/text/CharSequenceUtil.java
+++ b/hutool-core/src/main/java/org/dromara/hutool/core/text/CharSequenceUtil.java
@@ -3305,65 +3305,60 @@ public class CharSequenceUtil extends StrValidator {
}
/**
- * 方法注释:
- * 〈大写对应下标字母〉
+ * 大写对应下标字母
*
*
例如: str = name,index = 1, return nAme
*
- * 搜索关键字:
- * 大写
- * 大写下标
- * 大写字母
- * 大小写
- *
* @param str 字符串
- * @param index 下标
- * @return java.lang.String 字符串
+ * @param index 下标,支持负数,-1表示最后一个字符
+ * @return 字符串
*/
- public static String upperIndex(final CharSequence str, final int index) {
-
- if (str == null) {
+ public static String upperAt(final CharSequence str, int index) {
+ if (null == str) {
return null;
}
- if (str.length() > 0) {
- final char charredAt = str.charAt(index);
- if (Character.isLowerCase(charredAt)) {
- return subPre(str, index) + Character.toUpperCase(charredAt) + subSuf(str, index + 1);
- }
+ // 支持负数
+ final int length = str.length();
+ if (index < 0) {
+ index += length;
+ }
+ if (index < 0 || index >= length) {
+ return str.toString();
}
+ final char c = str.charAt(index);
+ if (Character.isLowerCase(c)) {
+ return subPre(str, index) + Character.toUpperCase(c) + subSuf(str, index + 1);
+ }
return str.toString();
-
}
/**
- * 方法注释:
- * 〈小写对应下标字母〉
- *
- * 例如: str = NAME,index = 1, return NaME
- *
- * 搜索关键字:
- * 小写
- * 小写下标
- * 小写字母
- * 大小写
+ * 小写对应下标字母
+ * 例如: str = NAME,index = 1, return NaME
*
* @param str 字符串
- * @param index 下标
- * @return java.lang.String 字符串
+ * @param index 下标,支持负数,-1表示最后一个字符
+ * @return 字符串
*/
- public static String lowerIndex(final CharSequence str, final int index) {
-
+ public static String lowerAt(final CharSequence str, int index) {
if (str == null) {
return null;
}
- if (str.length() > 0) {
- final char charredAt = str.charAt(index);
- if (Character.isUpperCase(charredAt)) {
- return subPre(str, index) + Character.toLowerCase(charredAt) + subSuf(str, index + 1);
- }
+ // 支持负数
+ final int length = str.length();
+ if (index < 0) {
+ index += length;
+ }
+ if (index < 0 || index >= length) {
+ return str.toString();
+ }
+
+ final char c = str.charAt(index);
+ if (Character.isUpperCase(c)) {
+ return subPre(str, index) + Character.toLowerCase(c) + subSuf(str, index + 1);
}
return str.toString();
@@ -3378,7 +3373,7 @@ public class CharSequenceUtil extends StrValidator {
* @return 字符串
*/
public static String upperFirst(final CharSequence str) {
- return upperIndex(str, 0);
+ return upperAt(str, 0);
}
/**
@@ -3389,7 +3384,7 @@ public class CharSequenceUtil extends StrValidator {
* @return 字符串
*/
public static String lowerFirst(final CharSequence str) {
- return lowerIndex(str, 0);
+ return lowerAt(str, 0);
}
// endregion
diff --git a/hutool-core/src/test/java/org/dromara/hutool/core/text/CharSequenceUtilTest.java b/hutool-core/src/test/java/org/dromara/hutool/core/text/CharSequenceUtilTest.java
index 03b920dc8..b5efdc0df 100644
--- a/hutool-core/src/test/java/org/dromara/hutool/core/text/CharSequenceUtilTest.java
+++ b/hutool-core/src/test/java/org/dromara/hutool/core/text/CharSequenceUtilTest.java
@@ -117,6 +117,12 @@ public class CharSequenceUtilTest {
Assertions.assertEquals(41, v.getBytes(CharsetUtil.GBK).length);
}
+ @Test
+ void subPreTest() {
+ final String pre = CharSequenceUtil.subPre("abc", 0);
+ Assertions.assertEquals(StrUtil.EMPTY, pre);
+ }
+
@Test
public void startWithTest() {
// https://gitee.com/dromara/hutool/issues/I4MV7Q
@@ -337,32 +343,31 @@ public class CharSequenceUtilTest {
}
@Test
- public void upperIndexTest() {
-
+ void upperAtTest() {
final StringBuilder sb = new StringBuilder("key");
- final String s1 = CharSequenceUtil.upperIndex(sb, 0);
+ final String s1 = CharSequenceUtil.upperAt(sb, 0);
Assertions.assertEquals("Key", s1);
- final String s2 = CharSequenceUtil.upperIndex(sb, 1);
+ final String s2 = CharSequenceUtil.upperAt(sb, 1);
Assertions.assertEquals("kEy", s2);
- final String s3 = CharSequenceUtil.upperIndex(sb, 2);
+ final String s3 = CharSequenceUtil.upperAt(sb, 2);
Assertions.assertEquals("keY", s3);
}
@Test
- public void lowerIndexTest() {
+ void lowerAtTest() {
final StringBuilder sb = new StringBuilder("KEY");
- final String s1 = CharSequenceUtil.lowerIndex(sb, 0);
+ final String s1 = CharSequenceUtil.lowerAt(sb, 0);
Assertions.assertEquals("kEY", s1);
- final String s2 = CharSequenceUtil.lowerIndex(sb, 1);
+ final String s2 = CharSequenceUtil.lowerAt(sb, 1);
Assertions.assertEquals("KeY", s2);
- final String s3 = CharSequenceUtil.lowerIndex(sb, 2);
+ final String s3 = CharSequenceUtil.lowerAt(sb, 2);
Assertions.assertEquals("KEy", s3);
}
}