sprintf.java
来自「RESIN 3.2 最新源码」· Java 代码 · 共 807 行 · 第 1/2 页
JAVA
807 行
formatFixed(cb, digits, expt, prec, flags); } else if (type == 'e' || type == 'E') { if (roundDigits(digits, prec + 1)) expt++; formatExpt(cb, digits, expt, prec, flags); } else { if (roundDigits(digits, prec)) expt++; if (expt < -3 || expt > prec) formatExpt(cb, digits, expt, prec - 1, flags|NO_TRAIL_ZERO); else formatFixed(cb, digits, expt, prec - expt, flags|NO_TRAIL_ZERO); } } public static void formatDouble(CharBuffer cb, double value, int width, int prec, int flags, int type) { if (prec < 0) prec = 6; int offset = cb.length(); if ((flags & ZERO_FILL) != 0 && (value < 0 || (flags & (POS_PLUS|POS_SPACE)) != 0)) { offset++; width--; } if (value < 0) { cb.append((char) '-'); value = -value; } else if ((flags & POS_PLUS) != 0) { cb.append((char) '+'); } else if ((flags & POS_SPACE) != 0) { cb.append((char) ' '); } formatDouble(cb, value, prec, flags, type); width -= cb.length() - offset; for (int i = 0; i < width; i++) { if ((flags & LALIGN) != 0) cb.append(' '); else cb.insert(offset, (flags & ZERO_FILL) == 0 ? ' ' : '0'); } } private static boolean roundDigits(CharBuffer digits, int len) { if (len < 0 || digits.length() <= len) return false; int value = digits.charAt(len); if (value < '5') return false; for (int i = len - 1; i >= 0; i--) { int ch = digits.charAt(i); if (ch != '9') { digits.setCharAt(i, (char) (ch + 1)); return false; } digits.setCharAt(i, '0'); } digits.insert(0, '1'); return true; } private static void formatFixed(CharBuffer cb, CharBuffer digits, int expt, int prec, int flags) { int i = 0; int origExpt = expt; for (; expt > 0; expt--) { if (i < digits.length()) cb.append((char) digits.charAt(i++)); else cb.append('0'); } if (origExpt <= 0) // || digits.length() == 0) cb.append('0'); if (prec > 0 || (flags & ALT) != 0) cb.append('.'); for (; expt < 0 && prec > 0; expt++) { cb.append('0'); prec--; } for (; prec > 0 && i < digits.length(); i++) { cb.append(digits.charAt(i)); prec--; } for (; prec > 0 && (flags & (NO_TRAIL_ZERO|ALT)) != NO_TRAIL_ZERO; prec--) cb.append('0'); } private static void formatExpt(CharBuffer cb, CharBuffer digits, int expt, int prec, int flags) { if (digits.length() == 0) cb.append('0'); else cb.append((char) digits.charAt(0)); if (prec > 0 || (flags & ALT) != 0) cb.append('.'); for (int i = 1; i < digits.length(); i++) { if (prec > 0) cb.append((char) digits.charAt(i)); prec--; } for (; prec > 0 && (flags & (NO_TRAIL_ZERO|ALT)) != NO_TRAIL_ZERO; prec--) cb.append('0'); if ((flags & BIG) != 0) cb.append('E'); else cb.append('e'); formatInteger(cb, expt - 1, 0, 2, POS_PLUS, 10); } public static void formatInteger(CharBuffer cb, long dvalue, int width, int prec, int flags, int radix) { boolean isBig = (flags & BIG) != 0; int begin = cb.length(); long value; if (dvalue > 0) value = (long) (dvalue + 0.5); else value = (long) (dvalue - 0.5); if (value < 0 && radix == 10) { cb.append((char) '-'); value = -value; } else if (value >= 0 && radix == 10 && (flags & POS_PLUS) != 0) cb.append((char) '+'); else if (value >= 0 && radix == 10 && (flags & POS_SPACE) != 0) cb.append((char) ' '); else if (value < 0) value &= 0xffffffffL; else if (radix == 8 && (flags & ALT) != 0 && value != 0) cb.append('0'); else if (radix == 16 && (flags & ALT) != 0) cb.append((flags & BIG) == 0 ? "0x" : "0X"); if ((flags & ZERO_FILL) != 0) { width -= cb.length() - begin; begin = cb.length(); } int offset = cb.length(); int len = 0; while (value != 0) { len++; cb.insert(offset, (isBig ? bigDigits : digits)[(int) (value % radix)]); value /= radix; } for (int i = 0; i < prec - len; i++) cb.insert(offset, '0'); if (len == 0 && prec == 0) cb.insert(offset, '0'); width -= cb.length() - begin; for (; width > 0; width--) { if ((flags & LALIGN) != 0) cb.append(' '); else if ((flags & ZERO_FILL) != 0 && prec < 0) cb.insert(begin, '0'); else cb.insert(begin, ' '); } if (cb.length() == begin) cb.append('0'); } public static void formatInteger(CharBuffer cb, double dvalue, int width, int prec, int flags, int radix) { long value; if (dvalue > 0) value = (long) (dvalue + 0.5); else value = (long) (dvalue - 0.5); formatInteger(cb,value,width,prec,flags,radix); } public static void formatChar(CharBuffer cb, long ch, int width, int flags) { int offset = cb.length(); cb.append((char) ch); if ((flags & LALIGN) == 0) { for (int i = 0; i < width - 1; i++) cb.insert(offset, (char) ' '); } else { for (int i = 0; i < width - 1; i++) cb.append((char) ' '); } } public static void formatString(CharBuffer cb, String string, int prec, int width, int flags) { int offset = cb.length(); if (prec < 0) prec = Integer.MAX_VALUE; if ((flags & CSVESCAPE) != 0) { cb.append('\"'); offset+=1; width -= 1; } for (int i = 0; i < string.length() && i < prec; i++) { width--; char ch = string.charAt(i); if ((flags & JAVAESCAPE) != 0) { switch (ch) { case '\\': cb.append("\\\\"); offset+=1; width-=1; continue; case '\n': cb.append("\\n"); offset+=1; width-=1; continue; case '\r': cb.append("\\r"); offset+=1; width-=1; continue; case '\"': cb.append("\\\""); offset+=1; width-=1; continue; } } if ((flags & XMLESCAPE) != 0) { switch (ch) { case '<': cb.append("<"); offset+=3; width-=3; continue; case '>': cb.append(">"); offset+=3; width-=3; continue; case '&': cb.append("&"); offset+=4; width-=4; continue; case '\'': cb.append("'"); offset+=5; width-=5; continue; case '"': cb.append("""); offset+=5; width-=5; continue; } } cb.append(ch); } if ((flags & CSVESCAPE) != 0) { cb.append('\"'); offset+=1; width -= 1; } if ((flags & LALIGN) == 0) { for (int i = 0; i < width; i++) cb.insert(offset, (char) ' '); } else { for (int i = 0; i < width; i++) cb.append((char) ' '); } } private static void fixBits(CharBuffer cb, String format, int s, int i) { for (; s < i; s++) cb.append((char) format.charAt(s)); } /** * Converts some unknown value to a double. * * @param value the value to be converted. * * @return the double-converted value. */ public static double toDouble(Object value) { /** copied from com.caucho.el.Expr */ if (value == null) return 0; else if (value instanceof Number) { double dValue = ((Number) value).doubleValue(); if (Double.isNaN(dValue)) return 0; else return dValue; } else if (value.equals("")) return 0; else if (value instanceof String) { double dValue = Double.parseDouble((String) value); if (Double.isNaN(dValue)) return 0; else return dValue; } else { throw new IllegalArgumentException(L.l("can't convert {0} to double.", value.getClass().getName())); } } /** * Converts some unknown value to a long. * * @param value the value to be converted. * * @return the long-converted value. */ public static long toLong(Object value) { /** copied from com.caucho.el.Expr */ if (value == null) return 0; else if (value instanceof Number) return ((Number) value).longValue(); else if (value.equals("")) return 0; else if (value instanceof String) { int sign = 1; String string = (String) value; int length = string.length(); long intValue = 0; int i = 0; for (; i < length && Character.isWhitespace(string.charAt(i)); i++) { } if (length <= i) return 0; int ch = string.charAt(i); if (ch == '-') { sign = -1; i++; } else if (ch == '+') i++; for (; i < length; i++) { ch = string.charAt(i); if (ch >= '0' && ch <= '9') { intValue = 10 * intValue + ch - '0'; } else if (ch == '.') { // truncate the decimal i = length; break; } else break; } for (; i < length && Character.isWhitespace(string.charAt(i)); i++) { } if (i < length) throw new IllegalArgumentException(L.l("can't convert '{0}' to long.", string)); return sign * intValue; } else { throw new IllegalArgumentException(L.l("can't convert {0} to long.", value.getClass().getName())); } } /** * Converts some unknown value to a String. * * @param value the value to be converted. * @param nullValue the value to return if value == null * * @return the String converted value */ public static String toString(Object value, String nullValue) { return (value == null) ? nullValue : value.toString(); }}
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?