DecimalFormat クラスの使用例

/****************************/
/* DecimalFormat クラス     */
/*      coded by Y.Suganuma */
/****************************/
import java.io.*;
import java.text.*;

public class Test {

	/****************/
	/* main program */
	/****************/
	public static void main(String args[]) throws IOException
	{
		int x_i = 12345;
		double x_d1 = 0.12345;
		double x_d2 = 123.45;
					// int
		System.out.println("     数値");
		DecimalFormat df1 = new DecimalFormat("0");
		DecimalFormat df2 = new DecimalFormat("#");
		System.out.println(df1.format(x_i));
		System.out.println(df2.format(x_i));

		System.out.println("     0 の部分は表示されない");
		df1 = new DecimalFormat("0000000");
		df2 = new DecimalFormat("#######");
		System.out.println(df1.format(x_i));
		System.out.println(df2.format(x_i));

		System.out.println("     グループの区切り");
		df1 = new DecimalFormat("0,000,000");
		df2 = new DecimalFormat("#,###,###");
		System.out.println(df1.format(x_i));
		System.out.println(df2.format(x_i));

		System.out.println("     パーセントとパーミル");
		df1 = new DecimalFormat("%000,000,000");
		df2 = new DecimalFormat("\u2030###,###,###");
		System.out.println(df1.format(x_i));
		System.out.println(df2.format(x_i));

		System.out.println("     通貨記号");
		df1 = new DecimalFormat("\u00a4000,000,000");
		df2 = new DecimalFormat("\u00a4###,###,###");
		System.out.println(df1.format(x_i));
		System.out.println(df2.format(x_i));

		System.out.println("     特殊文字");
		df1 = new DecimalFormat("'$'000,000,000");
		df2 = new DecimalFormat("'$'###,###,###");
		System.out.println(df1.format(x_i));
		System.out.println(df2.format(x_i));

		System.out.println("     サブパターン(正負の表現方法を変える)");
		df1 = new DecimalFormat(",###");
		df2 = new DecimalFormat(",###;(,###)");
		System.out.println(df1.format(-x_i));
		System.out.println(df2.format(-x_i));
					// double
		System.out.println("     数値(小数点以下を表示しない)");
		df1 = new DecimalFormat("0");
		df2 = new DecimalFormat("#");
		System.out.println(df1.format(x_d1));
		System.out.println(df2.format(x_d1));
		System.out.println(df1.format(x_d2));
		System.out.println(df2.format(x_d2));

		System.out.println("     数値(小数点以下を表示)");
		df1 = new DecimalFormat("00000.000");
		df2 = new DecimalFormat("#####.###");
		System.out.println(df1.format(x_d1));
		System.out.println(df2.format(x_d1));
		System.out.println(df1.format(x_d2));
		System.out.println(df2.format(x_d2));

		System.out.println("     科学表記法");
		df1 = new DecimalFormat("00.000E000");
		df2 = new DecimalFormat("##.###E0");
		System.out.println(df1.format(x_d1));
		System.out.println(df2.format(x_d1));
		System.out.println(df1.format(x_d2));
		System.out.println(df2.format(x_d2));
	}
}

/*
 上の例からも明らかなように,全体の桁数を揃える(固定された幅で出力する)
ようなことは出来ません.そのようなことをしたい場合は,例えば,以下のような
プログラムを書く必要があります.
*/

/**********************/
/* クラスFormatの定義 */
/**********************/
class Format {

	/***********************************************/
	/* 整数を指定した長さの文字列に変換            */
	/*      data : 整数データ                      */
	/*      n : 文字列の長さ                       */
	/*      return : 文字列                        */
	/*                 左側を空白で埋める          */
	/*                 長すぎるときは「*」で埋める */
	/***********************************************/
	static String Edit(int data, int n)
	{
		int i1, len;
		String str;

		str = String.valueOf(data);
		len = str.length();

		if (len != n) {
					// 長さが短い
			if (len < n) {
				for (i1 = 0; i1 < n-len; i1++)
					str = " " + str;
			}
					// 長さが長すぎる
			else {
				char c[] = new char [n];
				for (i1 = 0; i1 < n; i1++)
					c[i1] = '*';
				str = String.copyValueOf(c);
			}
		}

		return str;
	}

	/***********************************************/
	/* 実数を指定した長さの文字列に変換            */
	/* (オーバーフローのチェックは行っていない)  */
	/*      data : 実数データ                      */
	/*      sw : 表現方法                          */
	/*             =0 : ±xxxx.xx                  */
	/*             =1 : ±x.xxxxxE±xxx            */
	/*      p : 小数点以下の桁数                   */
	/*      n : 文字列の長さ                       */
	/*      return : 文字列                        */
	/*                 必要なら空白または0で埋める */
	/*                 長すぎるときは「*」で埋める */
	/***********************************************/
	static String Edit(double data, int sw, int p, int n)
	{
		double x;
		int i1, k, k1, len;
		String str, s1, s2, s3;

		str = String.valueOf(data);   // 元のデータの文字列表現
/*
     固定小数点表示
*/
		if (sw == 0) {
					// 入力データが固定小数点表示の場合
			if (str.indexOf('E') < 0 && str.indexOf('e') < 0) {
						// 小数点以上と以下を取り出す
				k   = str.indexOf('.');
				s1  = str.substring(0, k);
				s2  = str.substring(k+1);
						// 全体の文字列の作成
				str = Append(data, p, n, s1, s2);
			}
					// 入力データが浮動小数点表示の場合
			else {
						// 仮数部と指数部
				k = str.indexOf('E');
				if (k < 0)
					k = str.indexOf('e');
				s1 = str.substring(0, k);
				s2 = str.substring(k+1);
						// 指数部の値
				k1 = Integer.parseInt(s2);
						// 仮数部の小数点以上と以下
				k  = s1.indexOf('.');
				s2 = s1.substring(k+1);
				s1 = s1.substring(0, k);
						// 小数点以上と以下の調整
				if (k1 != 0) {
					if (k1 > 0) {
						len = s2.length();
						if (k1 == len) {
							s1 += s2;
							s2  = "0";
						}
						else {
							if (k1 < len) {
								s1 += s2.substring(0, k1-1);
								s2  = s2.substring(k1);
							}
							else {
								s1 += s2;
								for (i1 = 0; i1 < k1-len; i1++)
									s1 += "0";
								s2 = "0";
							}
						}
					}
					else {
						len = s1.length();
						k1  = -k1;
						if (k1 == len) {
							s2 = s1 + s2;
							s1 = "0";
						}
						else {
							if (k1 < len) {
								s2 = s1.substring(len-k1) + s2;
								s1 = s1.substring(0, len-k1);
							}
							else {
								s2 = s1 + s2;
								for (i1 = 0; i1 < k1-len; i1++)
									s2 = "0" + s2;
								s1 = "0";
							}
						}
					}
				}
						// 全体の文字列の作成
				str = Append(data, p, n, s1, s2);
			}
		}
/*
     浮動小数点表示
*/
		else {
					// 入力データが固定小数点表示の場合
			if (str.indexOf('E') < 0 && str.indexOf('e') < 0) {
						// 指数部と仮数部を決める
				k1 = 0;
				x  = Math.abs(data);
				if (x >= 10.0) {
					while (x >= 10.0) {
						x /= 10.0;
						k1++;
					}
				}
				else {
					if (x < 1.0) {
						while (x < 1.0) {
							x *= 10.0;
							k1--;
						}
					}
				}
						// 指数部の調整
				if (k1 >= 0) {
					s3  = String.valueOf(k1);
					len = s3.length();
					if (len < 3) {
						for (i1 = 0; i1 < 3-len; i1++)
							s3 = "0" + s3;
					}
					s3 = "+" + s3;
				}
				else {
					s3  = String.valueOf(-k1);
					len = s3.length();
					if (len < 3) {
						for (i1 = 0; i1 < 3-len; i1++)
							s3 = "0" + s3;
					}
					s3 = "-" + s3;
				}
						// 仮数部の小数点以上と以下
				str = String.valueOf(x);
				k   = str.indexOf('.');
				s1  = str.substring(0, k);
				s2  = str.substring(k+1);
						// 仮数部の調整
				str = Append(x, p, n-5, s1, s2);
						// 桁数オーバー
				k = str.indexOf('*');
				if (k >= 0) {
					for (i1 = 0; i1 < 5; i1++)
						str += "*";
				}
						// 全体の文字列
				else
					str = str + "E" + s3;
			}
					// 入力データが浮動小数点表示の場合
			else {
						// 仮数部と指数部
				k = str.indexOf('E');
				if (k < 0)
					k = str.indexOf('e');
				s1 = str.substring(0, k);
				s2 = str.substring(k+1);
				x  = Double.parseDouble(s1);
						// 指数部の調整
				k1 = Integer.parseInt(s2);
				if (k1 >= 0) {
					s3  = String.valueOf(k1);
					len = s3.length();
					if (len < 3) {
						for (i1 = 0; i1 < 3-len; i1++)
							s3 = "0" + s3;
					}
					s3 = "+" + s3;
				}
				else {
					s3  = String.valueOf(-k1);
					len = s3.length();
					if (len < 3) {
						for (i1 = 0; i1 < 3-len; i1++)
							s3 = "0" + s3;
					}
					s3 = "-" + s3;
				}
						// 仮数部の小数点以上と以下
				k  = s1.indexOf('.');
				s2 = s1.substring(k+1);
				s1 = s1.substring(0, k);
						// 仮数部の調整
				str = Append(x, p, n-5, s1, s2);
						// 桁数オーバー
				k = str.indexOf('*');
				if (k >= 0) {
					for (i1 = 0; i1 < 5; i1++)
						str += "*";
				}
						// 全体の文字列
				else
					str = str + "E" + s3;
			}
		}

		return str;
	}

	/********************************************************/
	/* 小数点以上,及び,以下の文字列から全体の文字列を作成 */
	/*      data : 実数データ                               */
	/*      p : 小数点以下の桁数                            */
	/*      n : 文字列の長さ                                */
	/*      s1 : 小数点以上の文字列                         */
	/*      s2 : 小数点以下の文字列                         */
	/*      return : 文字列                                 */
	/********************************************************/
	static String Append(double data, int p, int n, String s1, String s2)
	{
		long L;
		int i1, k, len;
		String str;

					// 小数点以下の桁数の調整
		if (p == 0) {
			L = (long)data;
			if ((data-(double)L) >= 0.5) {
				L  = Long.parseLong(s1) + 1;
				s1 = String.valueOf(L);
			}
		}

		else {

			len = s2.length();

			if (len != p) {
				if (len < p) {
					for (i1 = 0; i1 < p-len; i1++)
						s2 += "0";
				}
				else {
					L = Long.parseLong(s2.substring(0, p));
					k = Integer.parseInt(s2.substring(p, p+1));
					if (k >= 5)
						L++;
					s2 = String.valueOf(L);
				}
			}
		}
					// 全体の長さの調整
		if (p == 0)
			str = s1;
		else
			str = s1 + "." + s2;

		len = str.length();

		if (len != n) {
			if (len < n) {
				for (i1 = 0; i1 < n-len; i1++)
					str = " " + str;
			}
			else {
				char c[] = new char [n];
				for (i1 = 0; i1 < n; i1++)
					c[i1] = '*';
				str = String.copyValueOf(c);
			}
		}

		return str;
	}
}
		
(出力)
     数値
12345
12345
     0 の部分は表示されない
0012345
12345
     グループの区切り
0,012,345
12,345
     パーセントとパーミル
%001,234,500
‰12,345,000
     通貨記号
¥000,012,345
¥12,345
     特殊文字
$000,012,345
$12,345
     サブパターン(正負の表現方法を変える)
-12,345
(12,345)
     数値(小数点以下を表示しない)
0
0
123
123
     数値(小数点以下を表示)
00000.123
0.123
00123.450
123.45
     科学表記法
12.345E-002
12.345E-2
12.345E001
1.2345E2