choiceformat.java
来自「纯java操作系统jnode,安装简单和操作简单的个人使用的Java操作系统」· Java 代码 · 共 503 行 · 第 1/2 页
JAVA
503 行
*
* @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 + =
减小字号Ctrl + -
显示快捷键?