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("&lt;"); offset+=3; width-=3; continue;          case '>':            cb.append("&gt;"); offset+=3; width-=3; continue;          case '&':            cb.append("&amp;"); offset+=4; width-=4; continue;          case '\'':            cb.append("&#039;"); offset+=5; width-=5; continue;          case '"':            cb.append("&#034;"); 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 + -
显示快捷键?