📄 choiceformat.java
字号:
* * @return The <code>StringBuffer</code> with the format string appended. */ public StringBuffer format (double num, StringBuffer appendBuf, FieldPosition pos) { if (choiceLimits.length == 0) return appendBuf; int index = 0; if (! Double.isNaN(num) && num >= choiceLimits[0]) { for (; index < choiceLimits.length - 1; ++index) { if (choiceLimits[index] <= num && num < choiceLimits[index + 1]) break; } } return appendBuf.append(choiceFormats[index]); } /** * This method returns the list of format strings in use. * * @return The list of format objects. */ public Object[] getFormats () { return (Object[]) choiceFormats.clone(); } /** * This method returns the list of range terminators in use. * * @return The list of range terminators. */ public double[] getLimits () { return (double[]) choiceLimits.clone(); } /** * This method returns a hash value for this object * * @return A hash value for this object. */ public int hashCode () { int hash = 0; for (int i = 0; i < choiceLimits.length; ++i) { long v = Double.doubleToLongBits(choiceLimits[i]); hash ^= (v ^ (v >>> 32)); hash ^= choiceFormats[i].hashCode(); } return hash; } /** * This method returns the lowest possible double greater than the * specified double. If the specified double value is equal to * <code>Double.NaN</code> then that is the value returned. * * @param d The specified double * * @return The lowest double value greater than the specified double. */ public static final double nextDouble (double d) { return nextDouble (d, true); } /** * This method returns a double that is either the next highest double * or next lowest double compared to the specified double depending on the * value of the passed boolean parameter. If the boolean parameter is * <code>true</code>, then the lowest possible double greater than the * specified double will be returned. Otherwise the highest possible * double less than the specified double will be returned. * * @param d The specified double * @param positive <code>true</code> to return the next highest * double, <code>false</code> otherwise. * * @return The next highest or lowest double value. */ public static double nextDouble (double d, boolean next) { if (Double.isInfinite(d) || Double.isNaN(d)) return d; long bits = Double.doubleToLongBits(d); long mantMask = (1L << mantissaBits) - 1; long mantissa = bits & mantMask; long expMask = (1L << exponentBits) - 1; long exponent = (bits >>> mantissaBits) & expMask; if (next ^ (bits < 0)) // Increment magnitude { if (mantissa == (1L << mantissaBits) - 1) { mantissa = 0L; exponent++; // Check for absolute overflow. if (exponent >= (1L << mantissaBits)) return (bits > 0) ? Double.POSITIVE_INFINITY : Double.NEGATIVE_INFINITY; } else mantissa++; } else // Decrement magnitude { if (exponent == 0L && mantissa == 0L) { // The only case where there is a change of sign return next ? Double.MIN_VALUE : -Double.MIN_VALUE; } else { if (mantissa == 0L) { mantissa = (1L << mantissaBits) - 1; exponent--; } else mantissa--; } } long result = bits < 0 ? 1 : 0; result = (result << exponentBits) | exponent; result = (result << mantissaBits) | mantissa; return Double.longBitsToDouble(result); } /** * I'm not sure what this method is really supposed to do, as it is * not documented. */ public Number parse (String sourceStr, ParsePosition pos) { int index = pos.getIndex(); for (int i = 0; i < choiceLimits.length; ++i) { if (sourceStr.startsWith(choiceFormats[i], index)) { pos.setIndex(index + choiceFormats[i].length()); return new Double (choiceLimits[i]); } } pos.setErrorIndex(index); return new Double (Double.NaN); } /** * This method returns the highest possible double less than the * specified double. If the specified double value is equal to * <code>Double.NaN</code> then that is the value returned. * * @param d The specified double * * @return The highest double value less than the specified double. */ public static final double previousDouble (double d) { return nextDouble (d, false); } /** * This method sets new range terminators and format strings for this * object. * * @param choiceLimits The new range terminators * @param choiceFormats The new choice formats */ public void setChoices (double[] choiceLimits, String[] choiceFormats) { if (choiceLimits == null || choiceFormats == null) throw new NullPointerException (); if (choiceLimits.length != choiceFormats.length) throw new IllegalArgumentException (); this.choiceFormats = (String[]) choiceFormats.clone(); this.choiceLimits = (double[]) choiceLimits.clone(); } private final void quoteString (StringBuffer dest, String text) { int max = text.length(); for (int i = 0; i < max; ++i) { char c = text.charAt(i); if (c == '\'') { dest.append(c); dest.append(c); } else if (c == '#' || c == '|' || c == '\u2064' || c == '<') { dest.append('\''); dest.append(c); dest.append('\''); } else dest.append(c); } } /** * This method returns the range terminator list and format string list * as a <code>String</code> suitable for using with the * <code>applyPattern</code> method. * * @return A pattern string for this object */ public String toPattern () { StringBuffer result = new StringBuffer (); for (int i = 0; i < choiceLimits.length; ++i) { result.append(choiceLimits[i]); result.append('#'); quoteString (result, choiceFormats[i]); } return result.toString(); } /** * This is the list of format strings. Note that this variable is * specified by the serialization spec of this class. */ private String[] choiceFormats; /** * This is the list of range terminator values. Note that this variable is * specified by the serialization spec of this class. */ private double[] choiceLimits; // Number of mantissa bits in double. private static final int mantissaBits = 52; // Number of exponent bits in a double. private static final int exponentBits = 11; private static final long serialVersionUID = 1795184449645032964L;}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -