- ベストアンサー
スペース付加について
西暦から和暦変換の際の数字にスペースを挿入したい件でご質問があります。 例 20110717 → 平成24年 7月17日 19891207 → 平成 元年12月 7日 上記例のように年月日の前の1桁の数値もしくは元年の場合に スペースを挿入させたいのですが ご教授していただけないでしょうか?? スペースではなく0で埋めるのは簡単に出来るのですが どうぞよろしくお願いいたします。
- みんなの回答 (6)
- 専門家の回答
質問者が選んだベストアンサー
もう1ヶ所 // Stringクラスに変換 ではなく // String型に変換 ですね ボロボロで済みません
その他の回答 (5)
- ora540
- ベストアンサー率83% (5/6)
再々掲したソースにコメント間違いありました // 年月は前空白の2桁で表示する 月は0~11なので1追加 ではなく // 月日は前空白の2桁で表示する 月は0~11なので1追加 でした
- ora540
- ベストアンサー率83% (5/6)
「Date date = df.parse(checkDate, new ParsePosition(0));」の「checkDate」です。 mainルーチンの「showDate("20110717");」の「20110717」のところに抽出年月日を指定して、 よびだされた「showDate」メソッドの「String checkDate」でString型で「20110717」を「checkDate」に受け取っています。 コメントを入れなくて済みませんでした 元の感じに近づくよう、メソッドを分けず、定数の使用をやめ、変数名を戻したものを提示します。これでどうでしょうか? 私の力では元号・年・月日別に取得して、それを結合するしかできませんでした。 もっと実力のある方でしたら、エレガントな方法があるのかもしれませんが... よろしくお願いいたします。 import java.text.DateFormat; import java.text.ParsePosition; import java.text.SimpleDateFormat; import java.util.Calendar; import java.util.Date; import java.util.Locale; public class Display { public static void main(String[] args) { // 抽出年月日を checkDate に指定します String checkDate = "20110717"; // 日付の妥当性を厳密に( setLenientがfalse )チェックしています。 DateFormat sdf1 = new SimpleDateFormat("yyyyMMdd"); sdf1.setLenient(false); Date d = sdf1.parse(checkDate, new ParsePosition(0)); // ありえない日付なら null が戻ります if (d == null) { System.out.println("日付エラー![" + checkDate + "]"); return; } // 和暦カレンダー( Locale("ja", "JP", "JP")指定 )に妥当性チェックをパスした日付をセットします Calendar cal = Calendar.getInstance(new Locale("ja", "JP", "JP")); cal.setTime(d); // 和暦フォーマット( Locale("ja", "JP", "JP")指定 )で元号を取得します DateFormat sdf2 = new SimpleDateFormat("GGGG", new Locale("ja", "JP", "JP")); String era = sdf2.format(d); // 和暦フォーマット( Locale("ja", "JP", "JP")指定 )で年を取得します DateFormat dfYear = new SimpleDateFormat("yyyy年", new Locale("ja", "JP", "JP")); String yy = dfYear.format(d); // 文字列を結合します StringBuilder ymd = new StringBuilder(); // 空のベース ymd.append(era); // 元号追加 ymd.append(cal.get(Calendar.YEAR) < 10 ? " " + yy : yy); // 年が10未満(一桁)なら前に空白 ymd.append(String.format("%2s月%2s日", cal.get(Calendar.MONTH) + 1, cal.get(Calendar.DATE))); // 年月は前空白の2桁で表示する 月は0~11なので1追加 // Stringクラスに変換 String str = ymd.toString(); // 半角空白と数字「 0123456789」と比較 for (int i = 0; i < str.length(); i++) { int pos = " 0123456789".indexOf(str.charAt(i)); // 半角空白と数字「 0123456789」と比較 if (pos == -1) { // 無い場合は「-1」が、みつかれば何番目の半角文字とヒットしたかが返る continue; // ループを1回パスする } str = str.substring(0, i) + " 0123456789".charAt(pos)// 同じ番目の全角文字と差し替え + str.substring(i + 1); } // 変換後の文字を出力する System.out.println(str); } }
お礼
丁寧にご回答どうもありがとうございます。 全部作成して頂けると思ってなかったので 大変感謝しております。 これは、アドバイスを聞いただけではすぐ解決できない内容なので 助かりました。 本当にどうもありがとうございました。
- ora540
- ベストアンサー率83% (5/6)
ごめんなさい 数字が全角でなく半角で表示されてました。 あと、localeが定数なのに「final」が抜けていました。 以下修正後です。 import java.text.DateFormat; import java.text.ParsePosition; import java.text.SimpleDateFormat; import java.util.Calendar; import java.util.Date; import java.util.Locale; public class Display { private static final Locale JA_JP_JP = new Locale("ja", "JP", "JP"); public static void main(String[] args) { showDate("20110717"); showDate("19891207"); } private static void showDate(String checkDate) { DateFormat df = new SimpleDateFormat("yyyyMMdd"); df.setLenient(false); Date date = df.parse(checkDate, new ParsePosition(0)); if (date == null) { System.out.println("日付エラー![" + checkDate + "]"); return; } Calendar cal = Calendar.getInstance(JA_JP_JP); cal.setTime(date); DateFormat dfEra = new SimpleDateFormat("GGGG",JA_JP_JP); String era = dfEra.format(date); DateFormat dfYear = new SimpleDateFormat("yyyy年",JA_JP_JP); String yy = dfYear.format(date); StringBuilder ymd = new StringBuilder(); ymd.append(era); ymd.append(cal.get(Calendar.YEAR) < 10 ? " " + yy : yy); ymd.append(String.format("%2s月%2s日", cal.get(Calendar.MONTH) + 1, cal.get(Calendar.DATE))); String str = ymd.toString(); for (int i = 0; i < str.length(); i++) { int pos = " 0123456789".indexOf(str.charAt(i)); if (pos == -1) { continue; } str = str.substring(0, i) + " 0123456789".charAt(pos) + str.substring(i + 1); } System.out.println(str); } }
補足
色々とどうもありがとうございます。 構文がかなり増えて最初に提示したものと 比較して把握できなくなっているのですが 初めに提示しましたソースの中で Date d = sdf1.parse(抽出年月日, new ParsePosition(0)); の部分の抽出年月日はどこの部分になるのでしょうか?? そこを変更して検証結果を確認したいのですが・・・ 分かればよろしくお願いします。
- ora540
- ベストアンサー率83% (5/6)
無理やり感がありますが、自分なりに作ってみました。 一応、要件は満たしていると思うのですが... import java.text.DateFormat; import java.text.ParsePosition; import java.text.SimpleDateFormat; import java.util.Calendar; import java.util.Date; import java.util.Locale; public class Display { private static Locale JA_JP_JP = new Locale("ja", "JP", "JP"); public static void main(String[] args) { showDate("20110717"); showDate("19891207"); } private static void showDate(String checkDate) { DateFormat df = new SimpleDateFormat("yyyyMMdd"); df.setLenient(false); Date date = df.parse(checkDate, new ParsePosition(0)); if (date == null) { System.out.println("日付エラー![" + checkDate + "]"); return; } Calendar cal = Calendar.getInstance(JA_JP_JP); cal.setTime(date); DateFormat dfEra = new SimpleDateFormat("GGGG",JA_JP_JP); String era = dfEra.format(date); DateFormat dfYear = new SimpleDateFormat("yyyy年",JA_JP_JP); String yy = dfYear.format(date); StringBuilder ymd = new StringBuilder(); ymd.append(era); ymd.append(cal.get(Calendar.YEAR) < 10 ? " " + yy : yy); ymd.append(String.format("%2s月%2s日", cal.get(Calendar.MONTH) + 1, cal.get(Calendar.DATE))); System.out.println(ymd.toString()); } }
- jjon-com
- ベストアンサー率61% (1599/2592)
> スペースではなく0で埋めるのは簡単に出来るのですが というそのJavaソースコードを提示していただければ,それを活かした形の回答例が提示できると思います。
お礼
一部修正しました。 import java.text.*; import java.util.*; Calendar cal = Calendar.getInstance(); SimpleDateFormat sdf1 = new SimpleDateFormat("yyyyMMdd"); sdf1.setLenient(false); Date d = sdf1.parse(抽出年月日, new ParsePosition(0)); SimpleDateFormat sdf2 = new SimpleDateFormat("GGGGyyyy年M月d日", new Locale("ja", "JP", "JP")); sdf2.setLenient(false); System.out.println(sdf2.format(d) ,cal);
補足
まだサンプルコードのままですがこちらに 質問内容のようにスペースを付加したいので よろしくお願いします。 import java.text.*; import java.util.*; SimpleDateFormat sdf1 = new SimpleDateFormat(抽出年月日); sdf1.setLenient(false); Date d = sdf1.parse("20120705", new ParsePosition(0)); SimpleDateFormat sdf2 = new SimpleDateFormat("GGGGyyyy年M月d日", new Locale("ja", "JP", "JP")); System.out.println(sdf2.format(d));
補足
結果が確認でき、 質問内容と同じ結果が得られました。 これはちょっと自分に出来ない作業と思われるので ご相談して良かったです。 どうもありがとうございました。