分享:java中的格式化输出(类似C语言的printf)

王朝厨房·作者佚名  2007-01-04
窄屏简体版  字體: |||超大  

前几天想在java中用格式化输出,多亏rollingpig、zlzj2010等几位老大提示,现在我用text package中的NumberFormat和DecimalFomat实现了一把,给大家show一下,请多指教。

简单说明:

a.格式描述符:

1. L或l - 使数字左对齐(缺省是右对齐)

2. C或c - 使数字居中对齐(缺省是右对齐)

3. X或x - 显示数字为十六进制(缺省是十进制)

4. B或b - 显示数字为八进制(缺省是十进制)

5. ,(半角逗号)- 千位分隔符

6. S或s - 显示数字为科学记数法

7. Z或z - 用零填空位(缺省是空格)

8. w.d (两个整数用半角句号隔开)- 指定输出域宽及精度

b. "fillChar"是填空位符(缺省为空格)

--你可以用MyOut.fillChar = ’*’或’$’来定义你自己的空位符

举例:

println(123.45678, "8.3L") -> 123.457(左对齐占八位)

println(123.45678, "10.3cs") -> 1.235E2 (居中占十位)

println(1234567, ",10") -> 1,234,567(右对齐占十位)

// class MyOut

[code:1:49dae1322a]import java.io.PrintStream;

import java.io.PrintWriter;

import java.io.OutputStreamWriter;

import java.text.DecimalFormat;

import java.text.NumberFormat;

/* Thanks to Prof. H.Roumani.(He is my java teacher, who is great.)

*

* The format methods receive the value to be formatted (which can

* be of any type) and a format descriptor: a string that contains

* one or more of the following flags in any order and in any case:

*

* L:

* By default, all values are aligned right within their field

* width. If this flag is specified, left alignment is used instead.

* This flag has no effect if the field width is not specified.

* C:

* By default, all values are aligned right within their field

* width. If this flag is specified, centre alignment is used instead.

* This flag has no effect if the field width is not specified.

* X:

* By default, all numeric values are shown in the decimal system.

* If this flag is specified, hexadecimal is used instead (showing

* IEEE-754 for real’s). This flag has no effect if the value is not

* numeric.

* B:

* By default, all numeric values are shown in the decimal system.

* If this flag is specified, binary is used instead (showing

* IEEE-754 for real’s). This flag has no effect if the value is not

* numeric.

* ,:

* By default, all numeric, base-10 values are shown without a

* thousand-separator. If this flag is specified, a comma is inserted

* in the integer part of the number to separate thousands. This flag

* has no effect if the value is not numeric, is not in decimal, or if

* the scientific notation is used.

* S:

* By default, all numeric, base-10 values are shown as an integer part

* followed by a mantissa, or fractional part. If this flag is specified,

* scientific notation is used: One digits (possibly preceded by a minus

* sign) followed by a decimal point, a mantissa, the letter ’E’ and an

* exponent. This flag has no effect if the value is not numeric or is not

* in decimal.

* Z:

* By default, all integer, base-10 values are shown with leading or

* trailing spaces to fill the specified field width. If this flag is

* specified, the field is filled with leading zeros instead. This flag is

* only meaningful if the value is a base-10 integer, the width is specified,

* and the thousand-separator flag is not specified.

* w.d (two integers separated by a period):

* w is the desired width of the entire returned string, after formatting.

* If the formatted string is shorter than w, it will be padded by leading

* and/or trailing spaces (or some other fill character) depending on the

* requested alignment (left, right, or centre). d is the desired number of

* decimals and is meaningful only if the value is a base-10 real (in standard

* or scientific notation). Rounding to the specified number of decimals is

* done using conventional rules but the case of 5 is handled by rounding to

* the nearest even number (same as the rint method of the Math class). Note

* that you can specify only w (in that case don’t include the period), or

* only d (in this last case do precede it by the period).

*/

public class MyOut

{

/*************************************************************

Formats the passed value using the passed format descriptor

and returns the result as a string.

@param value the value to be formatted.

@param fd the format descriptor.

@return the formatted value as a string.

**************************************************************/

public static String format(byte value, String fd)

{

return formatInteger(value, fd, 8);

}

/*************************************************************

Formats the passed value using the passed format descriptor

and returns the result as a string.

@param value the value to be formatted.

@param fd the format descriptor.

@return the formatted value as a string.

**************************************************************/

public static String format(char value, String fd)

{

return formatInteger(value, fd, 16);

}

/*************************************************************

Formats the passed value using the passed format descriptor

and returns the result as a string.

@param value the value to be formatted.

@param fd the format descriptor.

@return the formatted value as a string.

**************************************************************/

public static String format(double value, String fd)

{

extractAttributes(fd);

String s1;

if(base == ’B’)

{

s1 = Long.toBinaryString(Double.doubleToLongBits(value));

s1 = repeat(64, ’0’) + s1;

s1 = s1.substring(s1.length() - 64);

} else if(base == ’X’)

{

s1 = Long.toHexString(Double.doubleToLongBits(value));

s1 = repeat(16, ’0’) + s1;

s1 = s1.substring(s1.length() - 16);

} else

{

pattern = decimals != -1 ? "." + repeat(decimals, ’0’) : ".#";

if(scientific)

pattern = "0" + pattern + "E0";

else

pattern = separator ? "#,##0" + pattern : "0" + pattern;

s1 = (new DecimalFormat(pattern)).format(value);

}

return size(s1);

}

/*************************************************************

Formats the passed value using the passed format descriptor

and returns the result as a string.

@param value the value to be formatted.

@param fd the format descriptor.

@return the formatted value as a string.

**************************************************************/

public static String format(float value, String fd)

{

extractAttributes(fd);

String s1;

if(base == ’B’)

{

s1 = Integer.toBinaryString(Float.floatToIntBits(value));

s1 = repeat(32, ’0’) + s1;

s1 = s1.substring(s1.length() - 32);

} else if(base == ’X’)

{

s1 = Integer.toHexString(Float.floatToIntBits(value));

s1 = repeat(8, ’0’) + s1;

s1 = s1.substring(s1.length() - 8);

} else

{

pattern = decimals != -1 ? "." + repeat(decimals, ’0’) : ".#";

if(scientific)

pattern = "0" + pattern + "E0";

else

pattern = separator ? "#,##0" + pattern : "0" + pattern;

s1 = (new DecimalFormat(pattern)).format(value);

}

return size(s1);

}

/*************************************************************

Formats the passed value using the passed format descriptor

and returns the result as a string.

@param value the value to be formatted.

@param fd the format descriptor.

@return the formatted value as a string.

**************************************************************/

public static String format(int value, String fd)

{

return formatInteger(value, fd, 32);

}

/*************************************************************

Formats the passed value using the passed format descriptor

and returns the result as a string.

@param value the value to be formatted.

@param fd the format descriptor.

@return the formatted value as a string.

**************************************************************/

public static String format(long value, String fd)

{

return formatInteger(value, fd, 64);

}

/*************************************************************

Formats the passed value using the passed format descriptor

and returns the result as a string.

@param value the value to be formatted.

@param fd the format descriptor.

@return the formatted value as a string.

**************************************************************/

public static String format(short value, String fd)

{

return formatInteger(value, fd, 16);

}

/* Formats the passed value using the passed format descriptor

* and returns the result as a string.

*/

private static String formatInteger(long l, String s, int i)

{

extractAttributes(s);

String s1;

if(base == ’B’)

{

s1 = Long.toBinaryString(l);

s1 = repeat(64, ’0’) + s1;

s1 = s1.substring(s1.length() - i);

} else

if(base == ’X’)

{

s1 = Long.toHexString(l);

s1 = repeat(16, ’0’) + s1;

s1 = s1.substring(s1.length() - i / 4);

} else

if(separator)

{

s1 = (new DecimalFormat("#,###")).format(l);

} else

{

s1 = String.valueOf(l);

if(zeroFill)

s1 = repeat(width - s1.length(), ’0’) + s1;

}

return size(s1);

}

// Gets information from the passed format descriptor.

private static void extractAttributes(String s)

{

s = s.toUpperCase();

alignment = ’R’;

separator = false;

base = ’D’;

scientific = false;

zeroFill = false;

width = -1;

decimals = -1;

int i = s.indexOf(76, 0);

if(i > -1)

{

alignment = ’L’;

s = s.substring(0, i) + s.substring(i + 1);

}

i = s.indexOf(67, 0);

if(i > -1)

{

alignment = ’C’;

s = s.substring(0, i) + s.substring(i + 1);

}

i = s.indexOf(44, 0);

if(i > -1)

{

separator = true;

pattern = pattern + ",###";

s = s.substring(0, i) + s.substring(i + 1);

}

i = s.indexOf(88, 0);

if(i > -1)

{

base = ’X’;

s = s.substring(0, i) + s.substring(i + 1);

} else

{

i = s.indexOf(66, 0);

if(i > -1)

{

base = ’B’;

s = s.substring(0, i) + s.substring(i + 1);

}

}

i = s.indexOf(83, 0);

if(i > -1)

{

scientific = true;

s = s.substring(0, i) + s.substring(i + 1);

}

i = s.indexOf(90, 0);

if(i > -1)

{

zeroFill = true;

s = s.substring(0, i) + s.substring(i + 1);

}

i = s.indexOf(46, 0);

if(i > -1)

{

decimals = Integer.parseInt(s.substring(i + 1));

s = s.substring(0, i);

}

if(s.length() > 0)

width = Integer.parseInt(s);

}

/*************************************************************

Output the passed value to the standard output device using

the passed format descriptor. No trailing End-Of-Line

character is printed.

@param value the value to be printed.

@param fd the format descriptor.

**************************************************************/

public static void print(byte value, String fd)

{

handle.print(format(value, fd));

handle.flush();

}

/*************************************************************

Output the passed value to the standard output device using

the passed format descriptor. No trailing End-Of-Line

character is printed.

@param value the value to be printed.

@param fd the format descriptor.

**************************************************************/

public static void print(char value, String fd)

{

handle.print(format(value, fd));

handle.flush();

}

/*************************************************************

Output the passed value to the standard output device using

the passed format descriptor. No trailing End-Of-Line

character is printed.

@param value the value to be printed.

@param fd the format descriptor.

**************************************************************/

public static void print(double value, String fd)

{

handle.print(format(value, fd));

handle.flush();

}

/*************************************************************

Output the passed value to the standard output device using

the passed format descriptor. No trailing End-Of-Line

character is printed.

@param value the value to be printed.

@param fd the format descriptor.

**************************************************************/

public static void print(float value, String fd)

{

handle.print(format(value, fd));

handle.flush();

}

/*************************************************************

Output the passed value to the standard output device using

the passed format descriptor. No trailing End-Of-Line

character is printed.

@param value the value to be printed.

@param fd the format descriptor.

**************************************************************/

public static void print(int value, String fd)

{

handle.print(format(value, fd));

handle.flush();

}

/*************************************************************

Output the passed value to the standard output device using

the passed format descriptor. No trailing End-Of-Line

character is printed.

@param value the value to be printed.

@param fd the format descriptor.

**************************************************************/

public static void print(long value, String fd)

{

handle.print(format(value, fd));

handle.flush();

}

/*************************************************************

Output the passed value to the standard output device using

the passed format descriptor. No trailing End-Of-Line

character is printed.

@param value the value to be printed.

@param fd the format descriptor.

**************************************************************/

public static void print(short value, String fd)

{

handle.print(format(value, fd));

handle.flush();

}

/*************************************************************

Output the passed value to the standard output device using

the passed format descriptorand followed by an End-Of-Line

marker.

@param value the value to be printed.

@param fd the format descriptor.

**************************************************************/

public static void println(byte value, String fd)

{

print(value, fd);

handle.print(EOL);

handle.flush();

}

/*************************************************************

Output the passed value to the standard output device using

the passed format descriptorand followed by an End-Of-Line

marker.

@param value the value to be printed.

@param fd the format descriptor.

**************************************************************/

public static void println(char value, String fd)

{

print(value, fd);

handle.print(EOL);

handle.flush();

}

/*************************************************************

Output the passed value to the standard output device using

the passed format descriptorand followed by an End-Of-Line

marker.

@param value the value to be printed.

@param fd the format descriptor.

**************************************************************/

public static void println(double value, String fd)

{

print(value, fd);

handle.print(EOL);

handle.flush();

}

/*************************************************************

Output the passed value to the standard output device using

the passed format descriptorand followed by an End-Of-Line

marker.

@param value the value to be printed.

@param fd the format descriptor.

**************************************************************/

public static void println(float value, String fd)

{

print(value, fd);

handle.print(EOL);

handle.flush();

}

/*************************************************************

Output the passed value to the standard output device using

the passed format descriptorand followed by an End-Of-Line

marker.

@param value the value to be printed.

@param fd the format descriptor.

**************************************************************/

public static void println(int value, String fd)

{

print(value, fd);

handle.print(EOL);

handle.flush();

}

/*************************************************************

Output the passed value to the standard output device using

the passed format descriptorand followed by an End-Of-Line

marker.

@param value the value to be printed.

@param fd the format descriptor.

**************************************************************/

public static void println(long value, String fd)

{

print(value, fd);

handle.print(EOL);

handle.flush();

}

/*************************************************************

Output the passed value to the standard output device using

the passed format descriptorand followed by an End-Of-Line

marker.

@param value the value to be printed.

@param fd the format descriptor.

**************************************************************/

public static void println(short value, String fd)

{

print(value, fd);

handle.print(EOL);

handle.flush();

}

// Returns the string padding with ’fillChar’.

private static String size(String s)

{

int i = width - s.length();

if(alignment == ’R’)

return repeat(i, fillChar) + s;

if(alignment == ’L’)

return s + repeat(i, fillChar);

else

return repeat(i / 2, fillChar) + s + repeat(i / 2 + i % 2, fillChar);

}

// Repeats the passed character ’times’ times.

public static String repeat(int times, char c)

{

String s = "";

for(int i = 0; i < times; i++)

s = s + c;

return s;

}

private static final String EOL = System.getProperty("line.separator");

private static PrintWriter handle = new PrintWriter(new OutputStreamWriter(System.out));

public static char fillChar = ’ ’;

private static char alignment;

private static boolean separator;

private static char base;

private static boolean scientific;

priv, ate static boolean zeroFill;

private static int width;

private static int decimals;

private static String pattern;

}[/code:1:49dae1322a]

// class MyOutTester

[code:1:49dae1322a]// Test the format of numbers in different ways.

public class MyOutTester

{

public static void main(String[] args)

{

int i = 230;

double d = 114.495678905;

// Unformatted

System.out.print(i + " ");

System.out.println(d);

// Some formatting

MyOut.print(i, "11");

MyOut.println(d, "14.3");

// More formatting

MyOut.print(i, "11L");

MyOut.println(d, ",14.7");

// Scientific

MyOut.print(i, ",11");

MyOut.println(d, ",14.6s");

// Hexdecimal

MyOut.print(i, "x11");

MyOut.println(d, "x21");

// Changed fillChar

MyOut.fillChar = ’*’;

MyOut.print(i, "11");

MyOut.println(d, "14.3");

// Special case

MyOut.println(d, "");

}

} [/code:1:49dae1322a]

 
 
 
免责声明:本文为网络用户发布,其观点仅代表作者个人观点,与本站无关,本站仅提供信息存储服务。文中陈述内容未经本站证实,其真实性、完整性、及时性本站不作任何保证或承诺,请读者仅作参考,并请自行核实相关内容。
 
 
© 2005- 王朝網路 版權所有 導航