package com.opentravelsoft.util; import java.math.BigDecimal; import java.util.Calendar; import java.util.Date; import java.util.GregorianCalendar; import java.util.StringTokenizer; /** * 文字列を特定の型に変換するヘルパークラスです。<BR> * 現在は、許可される書式についてはコーディングで指定していますが、機能拡張可能 * な用に強化予定です。 * * @author <a herf="mailto:zhangsitao@gmail.com">Steven Zhang</a> * @version $Revision: 1.1 $ $Date: 2009/03/01 16:23:40 $ */ public class EbizStringParser { /** * 本クラスはインスタンスを生成しません。 */ protected EbizStringParser() { } /** * 指定されたカンマ付の数値文字列をShort型に変換します。<BR> * 文字列中のカンマは無視します。 * * @param argValue パース対象の文字列 * @return 変換後のShort値。変換できない場合は、null値。 */ public static Short shortValue(String argValue) { if (argValue == null) return null; try { String value = (argValue.indexOf(",") < 0) ? argValue : argValue.replaceAll(",", ""); return new Short(value); } catch (NumberFormatException ex) { return null; } } /** * 指定されたカンマ付の数値文字列をInteger型に変換します。<BR> * 文字列中のカンマは無視します。 * * @param argValue パース対象の文字列 * @return 変換後のInteger値。変換できない場合は、null値。 */ public static Integer integerValue(String argValue) { if (argValue == null) return null; try { String value = (argValue.indexOf(",") < 0) ? argValue : argValue.replaceAll(",", ""); return new Integer(value); } catch (NumberFormatException ex) { return null; } } /** * 指定されたカンマ付の数値文字列をLong型に変換します。<BR> * 文字列中のカンマは無視します。 * * @param argValue パース対象の文字列 * @return 変換後のLong値。変換できない場合は、null値。 */ public static Long longValue(String argValue) { if (argValue == null) return null; try { String value = (argValue.indexOf(",") < 0) ? argValue : argValue.replaceAll(",", ""); return new Long(value); } catch (NumberFormatException ex) { return null; } } /** * 指定されたカンマ付の数値文字列をBigDecimal型に変換します。<BR> * 文字列中のカンマは無視します。 * * @param argValue パース対象の文字列 * @return 変換後のBigDecimal値。変換できない場合は、null値。 */ public static BigDecimal decimalValue(String argValue) { if (argValue == null) return null; // JDK1.3.X以前に含まれるバグの回避 if (argValue.indexOf("--") >= 0) return null; try { String value = (argValue.indexOf(",") < 0) ? argValue : argValue.replaceAll(",", ""); return new BigDecimal(value); } catch (NumberFormatException ex) { return null; } } /** * 指定された日付文字列をDate型に変換します。<BR> * 指定可能な書式は以下の通りです。 * <UL> * <LI>y/M/d * <LI>y.M.d * <LI>y-M-d * <LI>yyyyMMdd * </UL> * * @param argValue パース対象の文字列 * @return 変換後のDate値。変換できない場合は、null値。 */ public static Date dateValue(String argValue) { if (argValue == null) return null; String year; String month; String day; StringTokenizer st = null; // yyyy/MM/dd 書式 if (argValue.indexOf("/") >= 0) { st = new StringTokenizer(argValue, "/"); if (st.countTokens() != 3) return null; } // yyyy-MM-dd 書式 if (argValue.indexOf("-") >= 0) { st = new StringTokenizer(argValue, "-"); if (st.countTokens() != 3) return null; } // yyyy.MM.dd 書式 if (argValue.indexOf(".") >= 0) { st = new StringTokenizer(argValue, "."); if (st.countTokens() != 3) return null; } if (st != null) { year = st.nextToken(); month = st.nextToken(); day = st.nextToken(); } else { if (argValue.length() != 8){ return null; } // yyyyMMdd 書式 year = argValue.substring(0, 4); month = argValue.substring(4, 6); day = argValue.substring(6, 8); } try { //数値に変換 int yearValue = Integer.parseInt(year); int monthValue = Integer.parseInt(month) - 1; int dayValue = Integer.parseInt(day); //カレンダーの作成 Calendar calendar = new GregorianCalendar(yearValue, monthValue, dayValue); //日付のチェックを厳密に行う calendar.setLenient(false); return calendar.getTime(); } catch (NumberFormatException ex) { return null; } catch (IllegalArgumentException ex) { return null; } } /** * 指定された時間文字列をDate型に変換します。<BR> * 指定可能な書式は以下の通りです。 * <UL> * <LI>HH:mm * <LI>HH:mm:ss * <LI>HHmm * <LI>HHmmss * </UL> * 日付は、自動的に西暦1年1月1日として扱います。 * * @param argValue パース対象の文字列 * @return 変換後のDate値。変換できない場合は、null値。 */ public static Date timeValue(String argValue) { if (argValue == null) return null; try { int hour = 0; int minute = 0; int second = 0; if (argValue.indexOf(":") >= 0) { StringTokenizer st = new StringTokenizer(argValue, ":"); switch (st.countTokens()) { case 2: // HH:mm hour = Integer.parseInt(st.nextToken()); minute = Integer.parseInt(st.nextToken()); second = 0; break; case 3: // HH:mm:ss hour = Integer.parseInt(st.nextToken()); minute = Integer.parseInt(st.nextToken()); second = Integer.parseInt(st.nextToken()); break; default: return null; } } else { switch (argValue.length()) { case 4: // HHmm hour = Integer.parseInt(argValue.substring(0, 2)); minute = Integer.parseInt(argValue.substring(2, 4)); second = 0; break; case 6: // HHmmss hour = Integer.parseInt(argValue.substring(0, 2)); minute = Integer.parseInt(argValue.substring(2, 4)); second = Integer.parseInt(argValue.substring(4, 6)); break; default: return null; } } //カレンダーの作成 Calendar calendar = new GregorianCalendar(1, 1, 1, hour, minute, second); //日付のチェックを厳密に行う calendar.setLenient(false); return calendar.getTime(); } catch (NumberFormatException ex) { return null; } catch (IllegalArgumentException ex) { return null; } } }