stringmodule.java
来自「RESIN 3.2 最新源码」· Java 代码 · 共 2,731 行 · 第 1/5 页
JAVA
2,731 行
else if (nextCh == 'N') { char nextnextnextCh; if (index + 3 < length) nextnextnextCh = toUpperCase(string.charAt(index + 3)); else nextnextnextCh = 0; if (nextnextCh < 'A' || nextnextCh > 'Z') { } else if (nextnextCh == 'E' && nextnextnextCh == 'D') { } else result.append('K'); } else if (prevCh == 'G') { result.append('K'); } else { switch (nextCh) { case 'E': case 'I': case 'Y': // makesoft result.append('J'); break; default: result.append('K'); break; } } break; case 'H': case 'W': case 'Y': switch (nextCh) { case 'A': case 'E': case 'I': case 'O': case 'U': // followed by a vowel if (ch == 'H') { switch (prevCh) { case 'C': case 'G': case 'P': case 'S': case 'T': // affecth break; default: result.append('H'); break; } } else result.append(ch); break; default: // not followed by a vowel break; } break; case 'K': if (prevCh != 'C') result.append('K'); break; case 'P': if (nextCh == 'H') result.append('F'); else result.append('P'); break; case 'Q': result.append('K'); break; case 'S': if (nextCh == 'I' && (nextnextCh == 'O' || nextnextCh == 'A')) { result.append('X'); } else if (nextCh == 'H') { result.append('X'); index++; } else result.append('S'); break; case 'T': if (nextCh == 'I' && (nextnextCh == 'O' || nextnextCh == 'A')) { result.append('X'); } else if (nextCh == 'H') { result.append('0'); index++; } else result.append('T'); break; case 'V': result.append('F'); break; case 'X': result.append('K'); result.append('S'); break; case 'Z': result.append('S'); break; case 'F': case 'J': case 'L': case 'M': case 'N': case 'R': result.append(ch); break; default: break; } } return result.toString(); } /** * Returns a formatted money value. * XXX: locale charset * * @param format the format * @param value the value * * @return a string of formatted values */ public static String money_format(Env env, String format, double value) { QuercusLocale monetary = env.getLocaleInfo().getMonetary(); Locale locale = monetary.getLocale(); return NumberFormat.getCurrencyInstance(locale).format(value); } // XXX: nl_langinfo // XXX: nl2br /** * Returns a formatted number. * * @param value the value * @param decimals the number of decimals * @param pointValue the decimal point string * @param groupValue the thousands separator * * @return a string of the formatted number */ public static String number_format(Env env, double value, @Optional int decimals, @Optional Value pointValue, @Optional Value groupValue) { boolean isGroupDefault = (groupValue instanceof DefaultValue); boolean isPointDefault = (pointValue instanceof DefaultValue); if (!isPointDefault && isGroupDefault) { env.warning(L.l("wrong parameter count")); return null; } String pattern; char point = '.'; if (!pointValue.isNull()) { String pointString = pointValue.toString(); point = (pointString.length() == 0) ? 0 : pointString.charAt(0); } char group = ','; if (!groupValue.isNull()) { String groupString = groupValue.toString(); group = (groupString.length() == 0) ? 0 : groupString.charAt(0); } if (decimals > 0) { StringBuilder patternBuilder = new StringBuilder(6 + decimals); patternBuilder.append(group == 0 ? "###0." : "#,##0."); for (int i = 0; i < decimals; i++) patternBuilder.append('0'); pattern = patternBuilder.toString(); } else { pattern = group == 0 ? "###0" : "#,##0"; } DecimalFormatSymbols decimalFormatSymbols; if (point == '.' && group == ',') decimalFormatSymbols = DEFAULT_DECIMAL_FORMAT_SYMBOLS; else { decimalFormatSymbols = new DecimalFormatSymbols(); decimalFormatSymbols.setDecimalSeparator(point); decimalFormatSymbols.setGroupingSeparator(group); decimalFormatSymbols.setZeroDigit('0'); } DecimalFormat format = new DecimalFormat(pattern, decimalFormatSymbols); String result = format.format(value); if (point == 0 && decimals > 0) { // no way to get DecimalFormat to output nothing for the point, // so remove it here int i = result.lastIndexOf(point); return result.substring(0, i) + result.substring(i + 1, result.length()); } else return result; } /** * Converts the first character to an integer. * * @param string the string to be converted * * @return the integer value */ public static long ord(StringValue string) { if (string.length() == 0) return 0; else return string.charAt(0); } /** * Parses the string as a query string. * * @param env the calling environment * @param str the query string * @param array the optional result array */ @UsesSymbolTable public static Value parse_str(Env env, String str, @Optional @Reference Value ref) { if (str == null) str = ""; boolean isRef = ref instanceof Var; ArrayValue result = null; if (isRef) { result = new ArrayValueImpl(); ref.set(result); } else if (ref instanceof ArrayValue) { result = (ArrayValue) ref; isRef = true; } else result = new ArrayValueImpl(); return StringUtility.parseStr(env, str, result, isRef, env.getHttpInputEncoding()); } /** * Prints the string. * * @param env the quercus environment * @param value the string to print */ public static long print(Env env, Value value) { value.print(env); return 1; } /** * print to the output with a formatter * * @param env the quercus environment * @param format the format string * @param args the format arguments * * @return the formatted string */ public static int printf(Env env, StringValue format, Value []args) { Value str = sprintf(env, format, args); str.print(env); return str.length(); } /** * Converts a RFC2045 quoted printable string to a string. */ // XXX: i18n public static String quoted_printable_decode(String str) { if (str == null) str = ""; StringBuilder sb = new StringBuilder(); int length = str.length(); for (int i = 0; i < length; i++) { char ch = str.charAt(i); if (33 <= ch && ch <= 60) sb.append(ch); else if (62 <= ch && ch <= 126) sb.append(ch); else if (ch == ' ' || ch == '\t') { if (i + 1 < str.length() && (str.charAt(i + 1) == '\r' || str.charAt(i + 1) == '\n')) { sb.append('='); sb.append(toUpperHexChar(ch >> 4)); sb.append(toUpperHexChar(ch)); } else sb.append(ch); } else if (ch == '\r' || ch == '\n') { sb.append(ch); } else { sb.append('='); sb.append(toUpperHexChar(ch >> 4)); sb.append(toUpperHexChar(ch)); } } return sb.toString(); } /** * Escapes meta characters. * * @param string the string to be quoted * * @return the quoted */ public static Value quotemeta(StringValue string) { int len = string.length(); StringValue sb = string.createStringBuilder(len * 5 / 4); for (int i = 0; i < len; i++) { char ch = string.charAt(i); switch (ch) { case '.': case '\\': case '+': case '*': case '?': case '[': case '^': case ']': case '(': case ')': case '$': sb.append("\\"); sb.append(ch); break; default: sb.append(ch); break; } } return sb; } private static final boolean[]TRIM_WHITESPACE = new boolean[256]; static { TRIM_WHITESPACE['\0'] = true; TRIM_WHITESPACE['\b'] = true; TRIM_WHITESPACE[' '] = true; TRIM_WHITESPACE['\t'] = true; TRIM_WHITESPACE['\r'] = true; TRIM_WHITESPACE['\n'] = true; } /** * Removes trailing whitespace. * * @param env the quercus environment * @param string the string to be trimmed * @param characters optional set of characters to trim * @return the trimmed string */ public static StringValue rtrim(Env env, StringValue string, @Optional String characters) { if (characters == null) characters = ""; boolean []trim; if (characters.equals("")) trim = TRIM_WHITESPACE; else trim = parseCharsetBitmap(characters); for (int i = string.length() - 1; i >= 0; i--) { char ch = string.charAt(i); if (ch >= 256 || ! trim[ch]) { if (i == string.length()) return string; else return (StringValue) string.subSequence(0, i + 1); } } return env.getEmptyString(); } /** * Sets locale configuration. */ public static Value setlocale(Env env, int category, Value localeArg, Value []fallback) { LocaleInfo localeInfo = env.getLocaleInfo(); if (localeArg instanceof ArrayValue) { for (Value value : ((ArrayValue) localeArg).values()) { QuercusLocale locale = setLocale(localeInfo, category, value.toString()); if (locale != null) return env.createString(locale.toString()); } } else { QuercusLocale locale = setLocale(localeInfo, category, localeArg.toString()); if (locale != null) return env.createString(locale.toString()); } for (int i = 0; i < fallback.length; i++) { QuercusLocale locale = setLocale(localeInfo, category, fallback[i].toString()); if (locale != null) return env.createString(locale.toString()); } return BooleanValue.FALSE; } /** * Sets locale configuration. */ private static QuercusLocale setLocale(LocaleInfo localeInfo, int category, String localeName) { QuercusLocale locale = findLocale(localeName); if (locale == null) return null; switch (category) { case LC_ALL: localeInfo.setAll(locale); return localeInfo.getMessages(); case LC_COLLATE: localeInfo.setCollate(locale); return localeInfo.getCollate(); case LC_CTYPE: localeInfo.setCtype(locale); return localeInfo.getCtype(); case LC_MONETARY: localeInfo.setMonetary(locale); return localeInfo.getMonetary(); case LC_NUMERIC: localeInfo.setNumeric(locale); return localeInfo.getNumeric(); case LC_TIME: localeInfo.setTime(locale); return localeInfo.getTime(); case LC_MESSAGES: localeInfo.setMessages(locale); return localeInfo.getMessages(); default: return null; } } /* * Example locale: fr_FR.UTF-8@euro, french (on Windows) * (French, France, UTF-8, with euro currency support) */ private static QuercusLocale findLocale(String localeName) { String language; String country; String charset = null; String variant = null; CharBuffer sb = CharBuffer.allocate(); int len = localeName.length(); int i = 0;
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?