/**
 * Copyright (c) 2003-2004 System Integrator Corporation.
 *                 All Rights Reserved.
 */
package jp.co.sint.tools;

import java.text.DateFormat;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date;

import jp.co.sint.config.SIConfig;
import jp.co.sint.config.SIFlagConf;

import org.apache.log4j.Category;
import org.apache.regexp.RE;

/**
 * @version $Id: SICheckUtil.java,v 1.0 2003/07/25 Exp $
 * @author     : Jinwang Chen
 * <br>Description : 画面から入力したデータをチェックする用の各共通メソッド
 * <p>History</p>
 * <p>Author&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Date&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Reason</p>
 * ============&nbsp;&nbsp;&nbsp;==========&nbsp;&nbsp;===========================<br>
 * J.W.Chen       2003/07/25  Original
 */

public class SICheckUtil {

  //ログ用のインスタンスの生成
  private static Category log=Category.getInstance(SIConfig.SILOG4J_WEBSHOP_CATEGORY_NAME);

  /**
   * <b>SICheckUtil</b>
   * コンストラクタ
   * @param  なし
   * @return なし
   * @throws なし
   */
  public SICheckUtil() {}

  /**
   * <b>isEmpty</b>
   * 空きデータをチェックします。
   * @param  lCheckedData チェック対象のデータ
   * @return true nullのデータ  false 非nullのデータ
   * @throws なし
   */
  public static boolean isEmpty(String lCheckedData){
    return SIUtil.isNull(lCheckedData);
  }

  /**
   * <b>isBetweenLenB</b>
   * 指定のデータのバイトの長さが、指定の長さの範囲以内でかどうかをチェックします。
   * @param  lCheckedData チェック対象のデータ
   * @param  lMinLen 最低長さ
   * @param  lMaxLen 最大長さ
   * @return true 指定範囲以内  false 範囲以外
   * @throws なし
   */
  public static boolean isBetweenLenB(String lCheckedData,int lMinLen,int lMaxLen){
    if (SIUtil.isNull(lCheckedData)) return true;
    boolean lValid=true;
    if (lMinLen>lMaxLen){int lTemp=0;lTemp=lMinLen;lMinLen=lMaxLen;lMaxLen=lMinLen;}
    int length = lCheckedData.getBytes().length;
    if (length>lMaxLen || length<lMinLen) lValid=false;
    return lValid;
  }

  /**
   * <b>isBetweenLenW</b>
   * 指定のデータの文字の長さが、指定の長さの範囲以内でかどうかをチェックします。
   * @param  lCheckedData チェック対象のデータ
   * @param  lMinLen 最低長さ
   * @param  lMaxLen 最大長さ
   * @return true 指定範囲以内  false 範囲以外
   * @throws なし
   */
  public static boolean isBetweenLenW(String lCheckedData,int lMinLen,int lMaxLen){
    if (SIUtil.isNull(lCheckedData)) return true;
    boolean lValid=true;
    if (lMinLen>lMaxLen){int lTemp=0;lTemp=lMinLen;lMinLen=lMaxLen;lMaxLen=lMinLen;}
    int length = lCheckedData.length();
    if (length>lMaxLen || length<lMinLen) lValid=false;
    return lValid;
  }

  /**
   * <b>isDigit</b>
   * 指定のデータが１〜９の半角数字でかどうかをチェックします。
   * @param  lCheckedData チェック対象のデータ
   * @return true 半角数字 false 非半角数字
   * @throws なし
   */
  public static boolean isDigit(String lCheckedData){
    if (SIUtil.isNull(lCheckedData)) return true;
    RE re=new RE("^[0-9]*$");
    return re.match(lCheckedData);
  }

  /**
   * <b>isAlpha</b>
   * 指定のデータが半角英字でかどうかをチェックします。
   * @param  lCheckedData チェック対象のデータ
   * @return true 半角英字 false 非半角英字
   * @throws なし
   */
  public static boolean isAlpha(String lCheckedData){
    if (SIUtil.isNull(lCheckedData)) return true;
    RE re=new RE("^[A-Za-z]*$");
    return re.match(lCheckedData);
  }

  /**
   * <b>isAlphaDigit</b>
   * 指定のデータが半角英数字でかどうかをチェックします。
   * @param  lCheckedData チェック対象のデータ
   * @return true 半角英数字 false 非半角英数字
   * @throws なし
   */
  public static boolean isAlphaDigit(String lCheckedData){
    if (SIUtil.isNull(lCheckedData)) return true;
    String lHankakuEisuSet="ABCDEFGHIJKLMNOPQRSTUVWXYZ";
    lHankakuEisuSet=lHankakuEisuSet+"abcdefghijklmnopqrstuvwxyz";
    lHankakuEisuSet=lHankakuEisuSet+"1234567890-._";
    for (int ii = 0; ii < lCheckedData.length(); ii++) {
      if (lHankakuEisuSet.lastIndexOf(lCheckedData.charAt(ii))==-1) return false;
    }
    return true;
  }

  /**
   * <b>isDate</b>
   * 指定のデータが正しい日付でかどうかをチェックします。
   * @param  lCheckedData チェック対象のデータ
   * @return true 正しい日付 false 正しくない日付
   * @throws なし
   */
  public static boolean isDate(String lCheckedData){
    if (isDate(lCheckedData,SIConfig.SIDATE_FORMAT )) return true;
    else if (isDate(lCheckedData,SIConfig.SIDATE_FORMAT0 )) return true;
    else return false;
  }

  /**
   * <b>isDate</b>
   * 指定のデータが正しい日付でかどうかをチェックします。
   * @param  lCheckedData チェック対象のデータ
   * @param  lFormat  日付のフォーマット
   * @return true 正しい日付 false 正しくない日付
   * @throws なし
   */
  public static boolean isDate(String lCheckedData,String lFormat){
    if (SIUtil.isNull(lCheckedData)) return true;
    else return isDateTime(lCheckedData+" 00:00:00",lFormat+" HH:mm:ss");
  }

  /**
   * <b>isDateTime</b>
   * 指定のデータが正しい日付でかどうかをチェックします。
   * @param  lCheckedData チェック対象のデータ
   * @return true 正しい日付 false 正しくない日付
   * @throws なし
   */
  public static boolean isDateTime(String lCheckedData){
    if (isDateTime(lCheckedData,SIConfig.SIDATE_TIME_FORMAT))return true;
    else if (isDateTime(lCheckedData,SIConfig.SIDATE_TIME_FORMAT))return true;
    else return false;
  }

  /**
   * <b>isDateTime</b>
   * 指定のデータが正しい日付でかどうかをチェックします。
   * @param  lCheckedData チェック対象のデータ
   * @param  lFormat  日付のフォーマット
   * @return true 正しい日付 false 正しくない日付
   * @throws なし
   */
  public static boolean isDateTime(String lCheckedData,String lFormat){
    if (SIUtil.isNull(lCheckedData)) return true;
    SIDateTime lDateTime=new SIDateTime();
    DateFormat lDateFormat = new SimpleDateFormat(lFormat);
    lDateFormat.setLenient(false);
    try {
      lDateTime=new SIDateTime(lDateFormat.parse(lCheckedData));
      if (lDateTime.getYear()<1000 || lDateTime.getYear()>10000) return false;
      else return true;
    }catch (ParseException ex) {
      return false;
    }
  }

  /**
   * <b>isAsciii</b>
   * 指定のデータがASCIIの文字でかどうかをチェックします。
   * @param  lCheckedData チェック対象のデータ
   * @return true ASCII false 非ASCII
   * @throws なし
   */
  public static boolean isAsciii(String lCheckedData){
    if (SIUtil.isNull(lCheckedData)) return true;
    for (int ii = 0; ii < lCheckedData.length(); ii++) {
      if (lCheckedData.charAt(ii) > 0x7e) return false;
    }
    return true;
  }

  /**
   * <b>isZenkaku</b>
   * 指定のデータに全ての文字が全角でかどうかをチェックします。
   * @param  lCheckedData チェック対象のデータ
   * @return true 全角 false 一部の半角がある
   * @throws なし
   */
//7.2.0 ST0300 修正 ここから
  public static boolean isZenkaku(String lCheckedData) {
    return isZenkaku(lCheckedData, false);
  }

  public static boolean isZenkaku(String lCheckedData, boolean chkFlg) {
    boolean ret = false;
    if (chkFlg && SIUtil.isNotNull(lCheckedData)) {
      if (lCheckedData.getBytes().length == lCheckedData.length() * 2) {
        ret = true;
      }
    } else {
      ret = true;
    }
    return ret;
  }
//7.2.0 ST0300 修正 ここまで

  /**
   * <b>isHankaku</b>
   * 指定のデータに全ての文字が半角でかどうかをチェックします。
   * @param  lCheckedData チェック対象のデータ
   * @return true 半角 false 一部の全角がある
   * @throws なし
   */
  public static boolean isHankaku(String lCheckedData) {
    if (SIUtil.isNull(lCheckedData)) return true;
    int lLen = lCheckedData.getBytes().length;
    return lLen ==  lCheckedData.length();
  }

  /**
   * <b>isHankakuKana</b>
   * 指定のデータに全ての文字が半角カナでかどうかをチェックします。
   * @param  lCheckedData チェック対象のデータ
   * @return true 半角カナ false 非半角カナ
   * @throws なし
   */
  public static boolean isHankakuKana(String lCheckedData){
    if (SIUtil.isNull(lCheckedData)) return true;
    String lHankakuSet="ｱｲｳｴｵｶｷｸｹｺｻｼｽｾｿﾀﾁﾂﾃﾄﾅﾆﾇﾈﾉﾊﾋﾌﾍﾎﾏﾐﾑﾒﾓﾔﾕﾖﾗﾘﾙﾚﾛﾜｦﾝｯｬｭｮｧｨｩｪｫﾞﾟｰ "; // 7.4.0 ST2080 修正
    lHankakuSet=lHankakuSet+"1234567890-";
    for (int ii = 0; ii < lCheckedData.length(); ii++) {
      if (lHankakuSet.lastIndexOf(lCheckedData.charAt(ii))==-1) return false;
    }
    return true;
  }

  /**
   * <b>isZenkakuKana</b>
   * 指定のデータに全ての文字が全角カナでかどうかをチェックします。
   * @param  lCheckedData チェック対象のデータ
   * @return true 全角カナ false 非全角カナ
   * @throws なし
   */
  public static boolean isZenkakuKana(String lCheckedData){
    if (SIUtil.isNull(lCheckedData)) return true;
    String lZenkakuSet="アイウエオカキクケコサシスセソタチツテトナニヌネノハヒフヘホマミムメモヤユヨラリルレロワヲンーッ";
    lZenkakuSet=lZenkakuSet+"ガギグゲゴザジズゼゾダヂヅデドバビブベボャュョパピプペポァィゥェォヮヴ　";
    lZenkakuSet=lZenkakuSet+"ヰヱ";
    lZenkakuSet=lZenkakuSet+"ABCDEFGHIJKLMNOPQRSTUVWXYZ";
    lZenkakuSet=lZenkakuSet+"abcdefghijklmnopqrstuvwxyz";
    lZenkakuSet=lZenkakuSet+"ＡＢＣＤＥＦＧＨＩＪＫＬＭＮＯＰＱＲＳＴＵＶＷＸＹＺ";
    lZenkakuSet=lZenkakuSet+"ａｂｃｄｅｆｇｈｉｊｋｌｍｎｏｐｑｒｓｔｕｖｗｘｙｚ";
    lZenkakuSet=lZenkakuSet+"()（）";
    lZenkakuSet=lZenkakuSet+"0123456789０１２３４５６７８９-− ";
    for (int ii = 0; ii < lCheckedData.length(); ii++) {
      if (lZenkakuSet.lastIndexOf(lCheckedData.charAt(ii))==-1) return false;
    }
    return true;
  }

  /**
   * <b>isTel</b>
   * 指定のデータが電話番号でかどうかをチェックします。
   * @param  lCheckedData チェック対象のデータ
   * @return true 電話番号 false 非電話番号
   * @throws なし
   */
  public static boolean isTel(String lCheckedData){
    if (SIUtil.isNull(lCheckedData)) return true;
    RE re=new RE("^[0-9]+-?[0-9]*-?[0-9]*$");
    return re.match(lCheckedData);
  }

  /**
   * <b>isMail</b>
   * 指定のデータがメールフォーマットでかどうかをチェックします。
   * @param  lCheckedData チェック対象のデータ
   * @return true メールフォーマット false 非メールフォーマット
   * @throws なし
   */
  public static boolean isMail(String lCheckedData){
    if (SIUtil.isNull(lCheckedData)) return true;
    RE re=new RE("^[0-9A-Za-z\\.\\-_]+@[0-9A-Za-z\\.\\-_]+$");
    if (lCheckedData.endsWith("softbank.ne.jp")||lCheckedData.endsWith("vodafone.ne.jp")) {
      re=new RE("^[0-9A-Za-z\\.\\-_/]+@[0-9A-Za-z\\.\\-_]+$");
    }
    return re.match(lCheckedData);
  }

  /**
   * <b>isNumberBetween</b>
   * 指定のデータの数値が指定の数値範囲でかどうかをチェックします。
   * @param  lCheckedData チェック対象のデータ
   * @param  lMinNumber 範囲の下限
   * @param  lMaxNumber 範囲の上限
   * @return true 範囲以内  false 範囲以外
   * @throws なし
   */
  public static boolean isNumberBetween(String lCheckedData,int lMinNumber,int lMaxNumber){
    if (SIUtil.isNull(lCheckedData)) return true;
    try {
      return isNumberBetween(Integer.parseInt(lCheckedData),lMinNumber,lMaxNumber);
      }catch(Exception e){return false;}
  }

  public static boolean isNumberBetween(int lCheckedData,int lMinNumber,int lMaxNumber){
    int lTemp=lMaxNumber;
    if (lMinNumber>lMaxNumber){lMaxNumber=lMinNumber;lMinNumber=lTemp;}
    if (lCheckedData>lMaxNumber || lCheckedData<lMinNumber) return false;
    else return true;
  }
  
  /**
   * <b>isNumberAnd</b>
   * 指定のデータの数値が指定の数値範囲でかどうかをチェックします。
   * @param  lCheckedData チェック対象のデータ
   * @param  lMinNumber 範囲の下限
   * @param  lMaxNumber 範囲の上限
   * @return true 範囲以内  false 範囲以外
   * @throws なし
   */
  public static boolean isNumberAnd(String CheckedData,int lMinNumber,int lMaxNumber){
    if (SIUtil.isNull(CheckedData)) return true;
    int lCheckedData = Integer.parseInt(CheckedData);
    int lTemp=lMaxNumber;
    if (lMinNumber>lMaxNumber){lMaxNumber=lMinNumber;lMinNumber=lTemp;}
    if (lCheckedData>=lMinNumber && lCheckedData<=lMaxNumber) return false;
    else return true;
  }

  /**
   * <b>isFileName</b>
   * 正しいファイル名でかどうかをチェックします。
   * 禁止文字「\/:,;*?"<>|.」が含まれば、正しくないファイル名として処理します。
   * @param  lCheckedData チェック対象のデータ
   * @return true ファイル名  false 正しくないファイル名
   * @throws なし
   */
  public static boolean isFileName(String lCheckedData){
    //String lInvalidFileCharSet="\\/:,;*?\"<>|.";
    if (SIUtil.isNull(lCheckedData)) return true;
    RE re=new RE("[\\\\/\\:,;\\*\\?\\?\"<>|]");
    return !re.match(lCheckedData);
  }

  /**
   * <b>isFolderName</b>
   * 正しいフォルダ名でかどうかをチェックします。
   * 禁止文字「:,;*?"<>|.」が含まれば、正しくないファイル名として処理します。
   * @param  lCheckedData チェック対象のデータ
   * @return true ファイル名  false 正しくないファイル名
   * @throws なし
   */
  public static boolean isFolderName(String lCheckedData){
    if (SIUtil.isNull(lCheckedData)) return true;
    RE re=new RE("[\\:,;\\*\\?<>|\\.\"]");
    return !re.match(lCheckedData);
  }

  /**
   * <b>isURL</b>
   * 正しいURLでかどうかをチェックします。
   * @param  lCheckedData チェック対象のデータ
   * @return true ファイル名  false 正しくないファイル名
   * @throws なし
   */
  public static boolean isURL(String lCheckedData){
    if (SIUtil.isNull(lCheckedData)) return true;
    RE re=new RE("[^0-9A-Za-z!;:/\\-&'\"\\.\\?#<>%~\\+\\*-]");
    return !re.match(lCheckedData);
  }

  /**
   * <b>dateCompareTo</b>
   * 日付の比較
   * @param  lStartDate 開始日付
   * @param  lEndDate 終止日付
   * @return 1 開始>終止 0 開始=終止 -1 開始<終止
   * @throws なし
   */
  public static int dateCompareTo(Date lStartDate,Date lEndDate){
    SIDateTime lStart=new SIDateTime(lStartDate);
    SIDateTime lEnd=new SIDateTime(lEndDate);
    
    if (lStart.getTime()>lEnd.getTime()) return 1;
    else if (lStart.getTime()<lEnd.getTime()) return -1;
    else return 0;
  }

  /**
   * <b>dateCompareTo</b>
   * 日付の比較
   * @param  lStartDate 開始日付
   * @param  lEndDate 終止日付
   * @return 1 開始>終止 0 開始=終止 -1 開始<終止
   * @throws なし
   */
  private static int dateCompareTo(String lStartDate,String lEndDate,String lFormat) throws ParseException,SIException{
    if (!isDate(lStartDate)||!isDate(lEndDate)) throw new SIException();
    if (SIUtil.isNull( lStartDate)&&SIUtil.isNull( lEndDate)) return -2;
    
    if (SIUtil.isNotNull(lStartDate)&&SIUtil.isNull(lEndDate)) return 1;
    if (SIUtil.isNull(lStartDate)&&SIUtil.isNotNull(lEndDate)) return -1;
    
    SimpleDateFormat sdf=new SimpleDateFormat(lFormat);
    sdf.setLenient(false);
    
    return dateCompareTo(sdf.parse(lStartDate),sdf.parse(lEndDate));
  }

  /**
   * <b>dateLess</b>
   * 日付の早さをチェックします。
   * @param  lStartDate 開始日付
   * @param  lEndDate 終止日付
   * @return
   * @throws なし
   */
  public static boolean dateLess(String lStartDate,String lEndDate) throws ParseException,SIException{
    if (SIUtil.isNull( lStartDate) || SIUtil.isNull( lEndDate)) return true;
    if (dateCompareTo(lStartDate,lEndDate,SIConfig.SIDATE_FORMAT)==-1) return true;
    else return false;
  }

  public static boolean dateLess(String lStartDate,String lEndDate,String lFormat) throws ParseException,SIException{
    if (SIUtil.isNull( lStartDate) || SIUtil.isNull( lEndDate)) return true;
    if (dateCompareTo(lStartDate,lEndDate,lFormat)==-1) return true;
    else return false;
  }

  public static boolean dateLess(Date lStartDate,Date lEndDate){
    if (dateCompareTo(lStartDate,lEndDate)==-1) return true;
    else return false;
  }

  /**
   * <b>dateGreater</b>
   * 日付の遅さをチェックします。
   * @param  lStartDate 開始日付
   * @param  lEndDate 終止日付
   * @return
   * @throws なし
   */
  public static boolean dateGreater(String lStartDate,String lEndDate) throws ParseException,SIException{
    if (SIUtil.isNull( lStartDate) || SIUtil.isNull( lEndDate)) return true;
    if (dateCompareTo(lStartDate,lEndDate,SIConfig.SIDATE_FORMAT)==1) return true;
    else return false;
  }

  public static boolean dateGreater(String lStartDate,String lEndDate,String lFormat) throws ParseException,SIException{
    if (SIUtil.isNull( lStartDate) || SIUtil.isNull( lEndDate)) return true;
    if (dateCompareTo(lStartDate,lEndDate,lFormat)==1) return true;
    else return false;
  }

  public static boolean dateGreater(Date lStartDate,Date lEndDate){
    if (dateCompareTo(lStartDate,lEndDate)==1) return true;
    else return false;
  }

  /**
   * <b>dateGreaterEqual</b>
   * より大きい日付または同じ日付をチェックします。
   * @param  lStartDate 開始日付
   * @param  lEndDate 終止日付
   * @return
   * @throws なし
   */
  public static boolean dateGreaterEqual(String lStartDate,String lEndDate) throws ParseException,SIException{
    boolean lRes=dateGreater(lStartDate,lEndDate);
    if (lRes) return lRes;
    lRes=dateEqual(lStartDate,lEndDate);
    return lRes;
  }

  public static boolean dateGreaterEqual(String lStartDate,String lEndDate,String lFormat) throws ParseException,SIException{
    boolean lRes=dateGreater(lStartDate,lEndDate,lFormat);
    if (lRes) return lRes;
    lRes=dateEqual(lStartDate,lEndDate,lFormat);
    return lRes;
  }

  public static boolean dateGreaterEqual(Date lStartDate,Date lEndDate){
    boolean lRes=dateGreater(lStartDate,lEndDate);
    if (lRes) return lRes;
    lRes=dateEqual(lStartDate,lEndDate);
    return lRes;
  }


  /**
   * <b>dateLessEqual</b>
   * より遅い日付または同じ日付をチェックします。
   * @param  lStartDate 開始日付
   * @param  lEndDate 終止日付
   * @return
   * @throws なし
   */
  public static boolean dateLessEqual(String lStartDate,String lEndDate) throws ParseException,SIException{
    boolean lRes=dateLess(lStartDate,lEndDate);
    if (lRes) return lRes;
    lRes=dateEqual(lStartDate,lEndDate);
    return lRes;
  }

  public static boolean dateLessEqual(String lStartDate,String lEndDate,String lFormat) throws ParseException,SIException{
    boolean lRes=dateLess(lStartDate,lEndDate,lFormat);
    if (lRes) return lRes;
    lRes=dateEqual(lStartDate,lEndDate,lFormat);
    return lRes;
  }

  public static boolean dateLessEqual(Date lStartDate,Date lEndDate){
    boolean lRes=dateLess(lStartDate,lEndDate);
    if (lRes) return lRes;
    lRes=dateEqual(lStartDate,lEndDate);
    return lRes;
  }

  /**
   * <b>dateEqual</b>
   * 日付の等しさをチェックします。
   * @param  lStartDate 開始日付
   * @param  lEndDate 終止日付
   * @return
   * @throws なし
   */
  public static boolean dateEqual(String lStartDate,String lEndDate) throws ParseException,SIException{
    if (SIUtil.isNull( lStartDate) && SIUtil.isNull( lEndDate)) return true;
    if (dateCompareTo(lStartDate,lEndDate,SIConfig.SIDATE_FORMAT)==0) return true;
    else return false;
  }

  public static boolean dateEqual(String lStartDate,String lEndDate,String lFormat) throws ParseException,SIException{
    if (SIUtil.isNull( lStartDate)&&SIUtil.isNull( lEndDate)) return true;
    if (dateCompareTo(lStartDate,lEndDate,lFormat)==0) return true;
    else return false;
  }

  public static boolean dateEqual(Date lStartDate,Date lEndDate){
    if (dateCompareTo(lStartDate,lEndDate)==0) return true;
    else return false;
  }

  /**
   * <b>isEqual</b>
   * 二つ値の等しさをチェックします。
   * @param  lStr1 一つ目の値
   * @param  lStr2 二つ目の値
   * @return  二つの値が等しいかどうか
   * @throws なし
   */
  public static boolean isEqual(String lStr1,String lStr2){
    if (SIUtil.isNull(lStr1)||SIUtil.isNull(lStr2)) return true;
    float lNum1=0;
    float lNum2=0;
    try {lNum1=Float.parseFloat(lStr1);}catch(Exception e){e.printStackTrace();return true;}
    try {lNum2=Float.parseFloat(lStr2);}catch(Exception e){e.printStackTrace();return true;}
    return isCompare(lNum1,lNum2,SICheckDataConf.SICHECK_DATA_VALUE_EQUAL_TYPE);
  }

  /**
   * <b>isGreater</b>
   * 二つ値の等しさをチェックします。
   * @param  lStr1 一つ目の値
   * @param  lStr2 二つ目の値
   * @return  二つの値が等しいかどうか
   * @throws なし
   */
  public static boolean isGreater(String lStr1,String lStr2){
    if (SIUtil.isNull(lStr1)||SIUtil.isNull(lStr2)) return true;
    float lNum1=0;
    float lNum2=0;
    try {lNum1=Float.parseFloat(lStr1);}catch(Exception e){e.printStackTrace();return true;}
    try {lNum2=Float.parseFloat(lStr2);}catch(Exception e){e.printStackTrace();return true;}
    return isCompare(lNum1,lNum2,SICheckDataConf.SICHECK_DATA_VALUE_GREATER_TYPE);
  }

  /**
   * <b>isLess</b>
   * 二つ値の等しさをチェックします。
   * @param  lStr1 一つ目の値
   * @param  lStr2 二つ目の値
   * @return  二つの値が等しいかどうか
   * @throws なし
   */
  public static boolean isLess(String lStr1,String lStr2){
    if (SIUtil.isNull(lStr1)||SIUtil.isNull(lStr2)) return true;
    float lNum1=0;
    float lNum2=0;
    try {lNum1=Float.parseFloat(lStr1);}catch(Exception e){e.printStackTrace();return true;}
    try {lNum2=Float.parseFloat(lStr2);}catch(Exception e){e.printStackTrace();return true;}
    return isCompare(lNum1,lNum2,SICheckDataConf.SICHECK_DATA_VALUE_LESS_TYPE);
  }

  public static boolean isCompare(float lNum1,float lNum2,long lCompareType){
    if (lCompareType==SICheckDataConf.SICHECK_DATA_VALUE_EQUAL_TYPE && lNum1==lNum2) return true;
    else if (lCompareType==SICheckDataConf.SICHECK_DATA_VALUE_EQUAL_TYPE && lNum1!=lNum2) return false;
    else if (lCompareType==SICheckDataConf.SICHECK_DATA_VALUE_GREATER_TYPE && lNum1>lNum2) return true;
    else if (lCompareType==SICheckDataConf.SICHECK_DATA_VALUE_GREATER_TYPE && lNum1<=lNum2) return false;
    else if (lCompareType==SICheckDataConf.SICHECK_DATA_VALUE_LESS_TYPE && lNum1<lNum2) return true;
    else if (lCompareType==SICheckDataConf.SICHECK_DATA_VALUE_LESS_TYPE && lNum1>=lNum2) return false;
    else{
      log.debug("not known the compare type="+lCompareType);
      return false;
    }
  }

  /**
   * <b>isDigit</b>
   * 指定のデータが１〜９の半角数字でかどうかをチェックします。
   * @param  lCheckedData チェック対象のデータ
   * @return true 半角数字 false 非半角数字
   * @throws なし
   */
  public static boolean isDigitNegative(String lCheckedData){
    if (SIUtil.isNull(lCheckedData)) return true;
    RE positive=new RE("^[0-9]*$");
    RE negative=new RE("^\\-[0-9]*$");
    return (positive.match(lCheckedData) || negative.match(lCheckedData)) && !lCheckedData.equals("-0");
  }

  /**
   * <b>isAlphaDigit2</b>
   * 指定のデータが半角英数字でかどうかをチェックします。
   * @param  lCheckedData チェック対象のデータ
   * @return true 半角英数字 false 非半角英数字
   * @throws なし
   */
  public static boolean isAlphaDigit2(String lCheckedData){
    if (SIUtil.isNull(lCheckedData)) return true;
    String lHankakuEisuSet="ABCDEFGHIJKLMNOPQRSTUVWXYZ";
    lHankakuEisuSet=lHankakuEisuSet+"abcdefghijklmnopqrstuvwxyz";
    lHankakuEisuSet=lHankakuEisuSet+"1234567890-._ ";
    for (int ii = 0; ii < lCheckedData.length(); ii++) {
      if (lHankakuEisuSet.lastIndexOf(lCheckedData.charAt(ii))==-1) return false;
    }
    return true;
  }

  /**
   * <b>isAlphaDigit2</b>
   * 指定のデータが半角英数字でかどうかをチェックします。
   * @param  lCheckedData チェック対象のデータ
   * @return true 半角英数字 false 非半角英数字
   * @throws なし
   */
  public static boolean isValidFlag(String lCheckedData,int lInx){
    if(SIUtil.isNull(lCheckedData)) return true;
    String[][] lFlgList = SIFlagConf.SIFLAG_NAME[lInx];
    for(int i=0;i<lFlgList.length;i++){
      if(lCheckedData.equals(lFlgList[i][1])) return true;
    }
    return false;
  }
  
  /**
   * <b>isCmdtyName</b>
   * 指定のデータが商品名フォーマットかどうかをチェックします。
   * @param  lCheckedData チェック対象のデータ
   * @return true 商品名フォーマットOK false 商品名フォーマットNG
   * @throws なし
   */
  public static boolean isCmdtyName(String lCheckedData){
    if (SIUtil.isNull(lCheckedData)) return true;
    String lCmdtyNameNGSet="ＡＢＣＤＥＦＧＨＩＪＫＬＭＮＯＰＱＲＳＴＵＶＷＸＹＺ";
    lCmdtyNameNGSet=lCmdtyNameNGSet+"ａｂｃｄｅｆｇｈｉｊｋｌｍｎｏｐｑｒｓｔｕｖｗｘｙｚ";
    lCmdtyNameNGSet=lCmdtyNameNGSet+"０１２３４５６７８９ｇsrqpo−．％＃　";
    lCmdtyNameNGSet=lCmdtyNameNGSet+"ｱｲｳｴｵｶｷｸｹｺｻｼｽｾｿﾀﾁﾂﾃﾄﾅﾆﾇﾈﾉﾊﾋﾌﾍﾎﾏﾐﾑﾒﾓﾔﾕﾖﾗﾘﾙﾚﾛﾜｦﾝｯｬｭｮｧｨｩｪｫﾞﾟｰ";
    for (int ii = 0; ii < lCheckedData.length(); ii++) {
      if (lCmdtyNameNGSet.lastIndexOf(lCheckedData.charAt(ii))>-1) return false;
    }
    return true;
  }
  
  public static boolean isCODE39(String lCheckedData){
    if (SIUtil.isNull(lCheckedData)) return true;
    String lCode39Set="ABCDEFGHIJKLMNOPQRSTUVWXYZ";
    lCode39Set=lCode39Set+"1234567890-. $/+%";
    for (int ii = 0; ii < lCheckedData.length(); ii++) {
      if (lCode39Set.lastIndexOf(lCheckedData.charAt(ii))==-1) return false;
    }
    return true;
  }
}