/****************************/ /* 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