You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
92 lines
3.5 KiB
92 lines
3.5 KiB
package com.ruoyi.common.core.text; |
|
|
|
import com.ruoyi.common.utils.StringUtils; |
|
|
|
/** |
|
* 字符串格式化 |
|
* |
|
* @author ruoyi |
|
*/ |
|
public class StrFormatter |
|
{ |
|
public static final String EMPTY_JSON = "{}"; |
|
public static final char C_BACKSLASH = '\\'; |
|
public static final char C_DELIM_START = '{'; |
|
public static final char C_DELIM_END = '}'; |
|
|
|
/** |
|
* 格式化字符串<br> |
|
* 此方法只是简单将占位符 {} 按照顺序替换为参数<br> |
|
* 如果想输出 {} 使用 \\转义 { 即可,如果想输出 {} 之前的 \ 使用双转义符 \\\\ 即可<br> |
|
* 例:<br> |
|
* 通常使用:format("this is {} for {}", "a", "b") -> this is a for b<br> |
|
* 转义{}: format("this is \\{} for {}", "a", "b") -> this is \{} for a<br> |
|
* 转义\: format("this is \\\\{} for {}", "a", "b") -> this is \a for b<br> |
|
* |
|
* @param strPattern 字符串模板 |
|
* @param argArray 参数列表 |
|
* @return 结果 |
|
*/ |
|
public static String format(final String strPattern, final Object... argArray) |
|
{ |
|
if (StringUtils.isEmpty(strPattern) || StringUtils.isEmpty(argArray)) |
|
{ |
|
return strPattern; |
|
} |
|
final int strPatternLength = strPattern.length(); |
|
|
|
// 初始化定义好的长度以获得更好的性能 |
|
StringBuilder sbuf = new StringBuilder(strPatternLength + 50); |
|
|
|
int handledPosition = 0; |
|
int delimIndex;// 占位符所在位置 |
|
for (int argIndex = 0; argIndex < argArray.length; argIndex++) |
|
{ |
|
delimIndex = strPattern.indexOf(EMPTY_JSON, handledPosition); |
|
if (delimIndex == -1) |
|
{ |
|
if (handledPosition == 0) |
|
{ |
|
return strPattern; |
|
} |
|
else |
|
{ // 字符串模板剩余部分不再包含占位符,加入剩余部分后返回结果 |
|
sbuf.append(strPattern, handledPosition, strPatternLength); |
|
return sbuf.toString(); |
|
} |
|
} |
|
else |
|
{ |
|
if (delimIndex > 0 && strPattern.charAt(delimIndex - 1) == C_BACKSLASH) |
|
{ |
|
if (delimIndex > 1 && strPattern.charAt(delimIndex - 2) == C_BACKSLASH) |
|
{ |
|
// 转义符之前还有一个转义符,占位符依旧有效 |
|
sbuf.append(strPattern, handledPosition, delimIndex - 1); |
|
sbuf.append(Convert.utf8Str(argArray[argIndex])); |
|
handledPosition = delimIndex + 2; |
|
} |
|
else |
|
{ |
|
// 占位符被转义 |
|
argIndex--; |
|
sbuf.append(strPattern, handledPosition, delimIndex - 1); |
|
sbuf.append(C_DELIM_START); |
|
handledPosition = delimIndex + 1; |
|
} |
|
} |
|
else |
|
{ |
|
// 正常占位符 |
|
sbuf.append(strPattern, handledPosition, delimIndex); |
|
sbuf.append(Convert.utf8Str(argArray[argIndex])); |
|
handledPosition = delimIndex + 2; |
|
} |
|
} |
|
} |
|
// 加入最后一个占位符后所有的字符 |
|
sbuf.append(strPattern, handledPosition, strPattern.length()); |
|
|
|
return sbuf.toString(); |
|
} |
|
}
|
|
|