📄 bytebuffer.java
字号:
* Outputs a <CODE>double</CODE> into a format suitable for the PDF. * @param d a double * @return the <CODE>String</CODE> representation of the <CODE>double</CODE> */ public static String formatDouble(double d) { return formatDouble(d, null); } /** * Outputs a <CODE>double</CODE> into a format suitable for the PDF. * @param d a double * @return the <CODE>String</CODE> representation of the <CODE>double</CODE> if * <CODE>d</CODE> is <CODE>null</CODE>. If <CODE>d</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) { boolean negative = false; if (Math.abs(d) < 0.000015) { if (buf != null) { buf.append((byte)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((char)'-'); 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((char)'.'); 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(); } } /** * Sets the size to zero. */ public void reset() { count = 0; } /** * Creates a newly allocated byte array. Its size is the current * size of this output stream and the valid contents of the buffer * have been copied into it. * * @return the current contents of this output stream, as a byte array. */ public byte[] toByteArray() { byte newbuf[] = new byte[count]; System.arraycopy(buf, 0, newbuf, 0, count); return newbuf; } /** * Returns the current size of the buffer. * * @return the value of the <code>count</code> field, which is the number of valid bytes in this byte buffer. */ public int size() { return count; } /** * Converts the buffer's contents into a string, translating bytes into * characters according to the platform's default character encoding. * * @return String translated from the buffer's contents. */ public String toString() { return new String(buf, 0, count); } /** * Converts the buffer's contents into a string, translating bytes into * characters according to the specified character encoding. * * @param enc a character-encoding name. * @return String translated from the buffer's contents. * @throws UnsupportedEncodingException * If the named encoding is not supported. */ public String toString(String enc) throws UnsupportedEncodingException { return new String(buf, 0, count, enc); } /** * Writes the complete contents of this byte buffer output to * the specified output stream argument, as if by calling the output * stream's write method using <code>out.write(buf, 0, count)</code>. * * @param out the output stream to which to write the data. * @exception IOException if an I/O error occurs. */ public void writeTo(OutputStream out) throws IOException { out.write(buf, 0, count); } }
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -