package com.jcdm.common.core.text; import com.jcdm.common.utils.StringUtils; /** * å—ç¬¦ä¸²æ ¼å¼åŒ– * * @author jc */ 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(); } }