Code with Finding: |
class ByteBuffer {
/**
* Outputs a <CODE>double</CODE> into a format suitable for the PDF.
* @param d a double
* @param buf a ByteBuffer
* @return the <CODE>String</CODE> representation of the <CODE>double</CODE> if
* <CODE>buf</CODE> is <CODE>null</CODE>. If <CODE>buf</CODE> is <B>not</B> <CODE>null</CODE>,
* then the double is appended directly to the buffer and this methods returns <CODE>null</CODE>.
*/
public static String formatDouble(double d, ByteBuffer buf) {
if (HIGH_PRECISION) {
DecimalFormat dn = new DecimalFormat("0.######", dfs);
String sform = dn.format(d);
if (buf == null)
return sform;
else {
buf.append(sform);
return null;
}
}
boolean negative = false;
if (Math.abs(d) < 0.000015) {
if (buf != null) {
buf.append(ZERO);
return null;
} else {
return "0";
}
}
if (d < 0) {
negative = true;
d = -d;
}
if (d < 1.0) {
d += 0.000005;
if (d >= 1) {
if (negative) {
if (buf != null) {
buf.append((byte)'-');
buf.append((byte)'1');
return null;
} else {
return "-1";
}
} else {
if (buf != null) {
buf.append((byte)'1');
return null;
} else {
return "1";
}
}
}
if (buf != null) {
int v = (int) (d * 100000);
if (negative) buf.append((byte)'-');
buf.append((byte)'0');
buf.append((byte)'.');
buf.append( (byte)(v / 10000 + ZERO) );
if (v % 10000 != 0) {
buf.append( (byte)((v / 1000) % 10 + ZERO) );
if (v % 1000 != 0) {
buf.append( (byte)((v / 100) % 10 + ZERO) );
if (v % 100 != 0) {
buf.append((byte)((v / 10) % 10 + ZERO) );
if (v % 10 != 0) {
buf.append((byte)((v) % 10 + ZERO) );
}
}
}
}
return null;
} else {
int x = 100000;
int v = (int) (d * x);
StringBuffer res = new StringBuffer();
if (negative) res.append('-');
res.append("0.");
while( v < x/10 ) {
res.append('0');
x /= 10;
}
res.append(v);
int cut = res.length() - 1;
while (res.charAt(cut) == '0') {
--cut;
}
res.setLength(cut + 1);
return res.toString();
}
} else if (d <= 32767) {
d += 0.005;
int v = (int) (d * 100);
if (v < byteCacheSize && byteCache[v] != null) {
if (buf != null) {
if (negative) buf.append((byte)'-');
buf.append(byteCache[v]);
return null;
} else {
String tmp = PdfEncodings.convertToString(byteCache[v], null);
if (negative) tmp = "-" + tmp;
return tmp;
}
}
if (buf != null) {
if (v < byteCacheSize) {
//create the cachebyte[]
byte[] cache;
int size = 0;
if (v >= 1000000) {
//the original number is >=10000, we need 5 more bytes
size += 5;
} else if (v >= 100000) {
//the original number is >=1000, we need 4 more bytes
size += 4;
} else if (v >= 10000) {
//the original number is >=100, we need 3 more bytes
size += 3;
} else if (v >= 1000) {
//the original number is >=10, we need 2 more bytes
size += 2;
} else if (v >= 100) {
//the original number is >=1, we need 1 more bytes
size += 1;
}
//now we must check if we have a decimal number
if (v % 100 != 0) {
//yes, do not forget the "."
size += 2;
}
if (v % 10 != 0) {
size++;
}
cache = new byte[size];
int add = 0;
if (v >= 1000000) {
cache[add++] = bytes[(v / 1000000)];
}
if (v >= 100000) {
cache[add++] = bytes[(v / 100000) % 10];
}
if (v >= 10000) {
cache[add++] = bytes[(v / 10000) % 10];
}
if (v >= 1000) {
cache[add++] = bytes[(v / 1000) % 10];
}
if (v >= 100) {
cache[add++] = bytes[(v / 100) % 10];
}
if (v % 100 != 0) {
cache[add++] = (byte)'.';
cache[add++] = bytes[(v / 10) % 10];
if (v % 10 != 0) {
cache[add++] = bytes[v % 10];
}
}
byteCache[v] = cache;
}
if (negative) buf.append((byte)'-');
if (v >= 1000000) {
buf.append( bytes[(v / 1000000)] );
}
if (v >= 100000) {
buf.append( bytes[(v / 100000) % 10] );
}
if (v >= 10000) {
buf.append( bytes[(v / 10000) % 10] );
}
if (v >= 1000) {
buf.append( bytes[(v / 1000) % 10] );
}
if (v >= 100) {
buf.append( bytes[(v / 100) % 10] );
}
if (v % 100 != 0) {
buf.append((byte)'.');
buf.append( bytes[(v / 10) % 10] );
if (v % 10 != 0) {
buf.append( bytes[v % 10] );
}
}
return null;
} else {
StringBuffer res = new StringBuffer();
if (negative) res.append('-');
if (v >= 1000000) {
res.append( chars[(v / 1000000)] );
}
if (v >= 100000) {
res.append( chars[(v / 100000) % 10] );
}
if (v >= 10000) {
res.append( chars[(v / 10000) % 10] );
}
if (v >= 1000) {
res.append( chars[(v / 1000) % 10] );
}
if (v >= 100) {
res.append( chars[(v / 100) % 10] );
}
if (v % 100 != 0) {
res.append('.');
res.append( chars[(v / 10) % 10] );
if (v % 10 != 0) {
res.append( chars[v % 10] );
}
}
return res.toString();
}
} else {
StringBuffer res = new StringBuffer();
if (negative) res.append('-');
d += 0.5;
long v = (long) d;
return res.append(v).toString();
}
}
}
|