您的位置:首页 > 其它

Flex:对日本旧历日期及其它输入内容的验证。

2008-08-25 09:27 453 查看
由于客户要求,希望日期采用日本的旧历算法,并且要求验证。
我自己写了下面这个程序,我在代码方面还不成熟,有很多不足的地方,可能还存在Bug,希望有好的建议告诉我哦。

JapaneseCalendar.mxml
<?xml version="1.0" encoding="utf-8"?>
<mx:HBox xmlns:mx="http://www.adobe.com/2006/mxml" width="370" height="26" horizontalGap="4"
    horizontalAlign="left" paddingLeft="2" paddingTop="2"
    creationComplete="init();">
    <mx:Script>
        <![CDATA[
            import mx.managers.IFocusManagerComponent;
            import validate.ErrorValidate;
            import mx.managers.PopUpManager;
            import define.MsgCodeConst;
            import define.DefineCodeConst;
            import mx.collections.ArrayCollection;
            
            [Bindable]
            public var myTitle:String = "";
            [Bindable]
            public var myAC:ArrayCollection = new ArrayCollection([
                "明治", "大正", "昭和", "平成"]);
            
            private var errorArry:ArrayCollection = null;
            private var year:int = 0;
            private var month:int = 0;
            private var date:int = 0;
            private var gregorianYear:int = 0;
            private var isLeapYear:Boolean = false;            
            
            public function getYearName():String
            {
                return gengo.selectedLabel;
            }
            
            public function getYear():String
            {
                return dob_Year.text;
            }
            
            public function getMonth():String
            {
                return dob_Month.text;
            }
            
            public function getDate():String
            {
                return dob_Date.text;
            }
            
            private function init():void
            {
                focusManager.setFocus(IFocusManagerComponent(gengo));
            }
            public function doValid():ArrayCollection
            {
                year = int(dob_Year.text);
                month = int(dob_Month.text);
                date = int(dob_Date.text);
                
                errorArry = new ArrayCollection();
                var nowDate:Date = new Date();
                isLeapYear = isLeapYearCheck(gengo.text,year);
                
                gengo.setStyle(DefineCodeConst.BORDER_COLOR,DefineCodeConst.BLACK_COLOR);
                dob_Year.setStyle(DefineCodeConst.BACKGROUND_COLOR,DefineCodeConst.BLANK_COLOR);
                dob_Month.setStyle(DefineCodeConst.BACKGROUND_COLOR,DefineCodeConst.BLANK_COLOR);
                dob_Date.setStyle(DefineCodeConst.BACKGROUND_COLOR,DefineCodeConst.BLANK_COLOR);
                
                if(gengo.selectedIndex < 0)
                {
                    errorArry.addItem(myTitle + MsgCodeConst.ERR_TAG + MsgCodeConst.ERR_0002);
                    gengo.setStyle(DefineCodeConst.BORDER_COLOR,DefineCodeConst.PINK_COLOR);
                }
                
                if(dob_Year.text == "")
                {
                    dob_Year.setStyle(DefineCodeConst.BACKGROUND_COLOR,DefineCodeConst.PINK_COLOR);
                    errorArry.addItem(yearLabel.text + MsgCodeConst.ERR_TAG + MsgCodeConst.ERR_0001);
                }
                else if(!ErrorValidate.isHalfNum(dob_Year.text))
                {
                    dob_Year.setStyle(DefineCodeConst.BACKGROUND_COLOR,DefineCodeConst.PINK_COLOR);
                    errorArry.addItem(yearLabel.text + MsgCodeConst.ERR_TAG + MsgCodeConst.ERR_0006);
                }
                else if(year < 1)
                {            
                    errorArry.addItem(MsgCodeConst.ERR_0017);
                    dob_Year.setStyle(DefineCodeConst.BACKGROUND_COLOR,DefineCodeConst.PINK_COLOR);
                }
                
                if(dob_Month.text == "")
                {
                    dob_Month.setStyle(DefineCodeConst.BACKGROUND_COLOR,DefineCodeConst.PINK_COLOR);
                    errorArry.addItem(monthLabel.text + MsgCodeConst.ERR_TAG + MsgCodeConst.ERR_0001);
                }
                else if(!ErrorValidate.isHalfNum(dob_Month.text))
                {
                    dob_Month.setStyle(DefineCodeConst.BACKGROUND_COLOR,DefineCodeConst.PINK_COLOR);
                    errorArry.addItem(monthLabel.text + MsgCodeConst.ERR_TAG + MsgCodeConst.ERR_0006);
                }
                else if((month < 1) || (month > 12))
                {            
                    errorArry.addItem(MsgCodeConst.ERR_0018);
                    dob_Month.setStyle(DefineCodeConst.BACKGROUND_COLOR,DefineCodeConst.PINK_COLOR);
                }
                
                if(dob_Date.text == "")
                {
                    dob_Date.setStyle(DefineCodeConst.BACKGROUND_COLOR,DefineCodeConst.PINK_COLOR);
                    errorArry.addItem(dateLabel.text + MsgCodeConst.ERR_TAG + MsgCodeConst.ERR_0001);
                }
                else if(!ErrorValidate.isHalfNum(dob_Date.text))
                {
                    dob_Date.setStyle(DefineCodeConst.BACKGROUND_COLOR,DefineCodeConst.PINK_COLOR);
                    errorArry.addItem(dateLabel.text + MsgCodeConst.ERR_TAG + MsgCodeConst.ERR_0006);
                }
                else if((date < 1) || (date > 31))
                {
                    errorArry.addItem(MsgCodeConst.ERR_0019);
                    dob_Date.setStyle(DefineCodeConst.BACKGROUND_COLOR,DefineCodeConst.PINK_COLOR);
                }
                
                /*  明治    1868年1月25日~1912年7月29日            1868 1912        45
                    大正    1912年7月30日~1926年12月24日            1912 1926    15
                    昭和    1926年12月25日~1989年1月7日            1926 1989    64
                    平成    1989年1月8日~                        1989 2008    20 */
                doValidJapaneseCalendar("明治",45,1,25,7,29);
                doValidJapaneseCalendar("大正",15,7,30,12,24);
                doValidJapaneseCalendar("昭和",64,12,25,1,7);
                doValidJapaneseCalendar("平成",(nowDate.fullYear-1989+1),1,8,nowDate.getMonth()+1,nowDate.getDate());
                isMonthCheck(month);
                isAgeCheck();
                if(errorArry.length > 0)
                {
                    return errorArry;
                }
                else
                {
                    return new ArrayCollection();
                }
            }
            
            /********************************************************<BR>
             * メソッド名:  doValidJapaneseCalendar                        <BR>
              *                                                              <BR>
             * 機能概要:指定された和暦が正しい日付かどうかをチェックする            <BR>
             *                                                       <BR>
             * @return ない                                             <BR>
             *                                                       <BR>
             * @作者   Tenghy                                             <BR>
             *                                                          <BR>
             * @serialData   2008 08 22                             <BR>
             *********************************************************/
            private function doValidJapaneseCalendar(YearName:String, maxYear:int, startMonth:int, startDate:int,
                                        endMonth:int, endDate:int):void
            {
                if(gengo.text == YearName)
                {                    
                    if(year > maxYear)
                    {
                        errorArry.addItem(MsgCodeConst.ERR_0024);
                        dob_Year.setStyle(DefineCodeConst.BACKGROUND_COLOR,DefineCodeConst.PINK_COLOR);
                    }
                    if((year == maxYear) && (month > endMonth))
                    {
                        errorArry.addItem(MsgCodeConst.ERR_0024);
                        dob_Month.setStyle(DefineCodeConst.BACKGROUND_COLOR,DefineCodeConst.PINK_COLOR);
                    }
                    if((year == maxYear) && (month == endMonth) && (date > endDate))
                    {
                        errorArry.addItem(MsgCodeConst.ERR_0024);
                        dob_Date.setStyle(DefineCodeConst.BACKGROUND_COLOR,DefineCodeConst.PINK_COLOR);
                    }
                    if((year == 1) && (month < startMonth))
                    {
                        errorArry.addItem(MsgCodeConst.ERR_0024);
                        dob_Month.setStyle(DefineCodeConst.BACKGROUND_COLOR,DefineCodeConst.PINK_COLOR);
                    }
                    if((year == 1) && (month == startMonth) && (date < startDate))
                    {
                        errorArry.addItem(MsgCodeConst.ERR_0024);
                        dob_Date.setStyle(DefineCodeConst.BACKGROUND_COLOR,DefineCodeConst.PINK_COLOR);
                    }
                }
            }
            
            /********************************************************<BR>
             * メソッド名:  isMonthCheck                                    <BR>
              *                                                              <BR>
             * 機能概要:毎月最大の日をチェックする                            <BR>
             *                                                       <BR>
             * @return ない                                                <BR>
             *                                                       <BR>
             * @作者   Tenghy                                             <BR>
             *
             * @serialData   2008 08 21                             <BR>
             *********************************************************/
            private function isMonthCheck(moth:int):void
            {
                switch(month)
                {
                    case 4:
                    case 6:
                    case 9:
                    case 11:
                        if(date > 30)
                        {
                            errorArry.addItem(MsgCodeConst.ERR_0021);
                            dob_Date.setStyle(DefineCodeConst.BACKGROUND_COLOR,DefineCodeConst.PINK_COLOR);
                        }
                        break;
                    case 2:
                        if(isLeapYea
10ceb
r && (date > 29))
                        {
                            errorArry.addItem(MsgCodeConst.ERR_0022);
                            dob_Date.setStyle(DefineCodeConst.BACKGROUND_COLOR,DefineCodeConst.PINK_COLOR);
                        }
                        else if(!isLeapYear && (date > 28))
                        {
                            errorArry.addItem(MsgCodeConst.ERR_0023);
                            dob_Date.setStyle(DefineCodeConst.BACKGROUND_COLOR,DefineCodeConst.PINK_COLOR);
                        }
                        break;
                }
            }
            
            /********************************************************<BR>
             * メソッド名:  isLeapYearCheck                                <BR>
              *                                                              <BR>
             * 機能概要:指定された西暦を表す年が閏年かをチェックする                <BR>
             *                                                       <BR>
             * @return ない                                                <BR>
             *                                                       <BR>
             * @作者   Tenghy                                             <BR>
             *
             * @serialData   2008 08 21                             <BR>
             *********************************************************/
            private function isLeapYearCheck(YearName:String,japaneseYear:int):Boolean
            {
                if(YearName == "明治")gregorianYear = japaneseYear + 1868 - 1;
                if(YearName == "大正")gregorianYear = japaneseYear + 1912 - 1;
                if(YearName == "昭和")gregorianYear = japaneseYear + 1926 - 1;
                if(YearName == "平成")gregorianYear = japaneseYear + 1989 - 1;
                if( ((gregorianYear % 4 == 0) && (gregorianYear % 100 != 0)) || (gregorianYear % 400 == 0 ) )
                {
                    return true;
                }
                else
                {
                    return false;
                }
            }
            
            /********************************************************<BR>
             * メソッド名:  isAgeCheck                                <BR>
              *                                                              <BR>
             * 機能概要:満20歳以上をチェックする                        <BR>
             *                                                       <BR>
             * @return ない                                                <BR>
             *                                                       <BR>
             * @作者   Tenghy                                             <BR>
             *
             * @serialData   2008 08 21                             <BR>
             *********************************************************/
            private function isAgeCheck():void
            {
                var nowDate:Date = new Date();
                var inputDate:Date = new Date();
                inputDate.setUTCFullYear(gregorianYear,month,date);
                if(nowDate.getUTCFullYear() - inputDate.getUTCFullYear() < 20)
                {
                    errorArry.addItem(MsgCodeConst.ERR_0020);
                }
            }
        ]]>
    </mx:Script>
    <mx:ComboBox height="22" id="gengo" width="126" dataProvider="{myAC}"/>
    <mx:TextInput id="dob_Year"  width="50" height="22" maxChars="2"/>
    <mx:Label text="年" id="yearLabel"/>
    <mx:TextInput id="dob_Month"  height="22" width="30" maxChars="2"/>
    <mx:Label text="月" id="monthLabel"/>
    <mx:TextInput id="dob_Date"  height="22" width="30" maxChars="2"/>
    <mx:Label text="日" id="dateLabel"/>    
</mx:HBox>

ErrorValidate.as文件,
package validate
{
    import sice.validator.IValidateItem;
    public class ErrorValidate
    {
        /********************************************************<BR>
         * メソッド名:  isLenNum                                                      <BR>
         * 機能概要:i~jであるかどうかチェックする                                <BR>
         *                (integer,float,double)                 <BR>
         *                                                       <BR>
         * @param 引数:value  入力文字列                                  <BR>
         *                                                       <BR>
         * @return 戻り値 True: はい False: いいえ                         <BR>
         *                                                       <BR>
         * @serialData   2008 08 15                             <BR>
         * @author TengHY                                        <BR>
         *********************************************************/
        public static function isLenNum(str:String,i:int,j:int):Boolean{
                if(str.length<=j && str.length >=i ){
                    return true;
                }else{
                    return false;
                }
        }
        /********************************************************<BR>
         * メソッド名:  isLargeEng                                               <BR>
         * 機能概要:英大文字であるかどうかチェックする                            <BR>
         *                (integer,float,double)                 <BR>
         *                                                       <BR>
         * @param 引数:value  入力文字列                                  <BR>
         *                                                       <BR>
         * @return 戻り値 True: はい False: いいえ                         <BR>
         *                                                       <BR>
         * @serialData   2008 08 15                             <BR>
         *********************************************************/
        public static function isLargeEng(str:String):Boolean {
            var c:String;
            var iLength:int = str.length;
            var checkUpperEn:Boolean = false;
            var ex2:String = "/[A-Z]";
            var re2:RegExp = new RegExp(ex2, "j");
            for (var i:int = 0; i < iLength; i++) {
                c = str.charAt(i);
                if(re2.test(c)) {
                    checkUpperEn = true;
                    break;
                }
            }
            return checkUpperEn;
        }
        /********************************************************<BR>
         * メソッド名:  isHalfNumberCheck                                   <BR>
         * 機能概要:半角数字であるかどうかチェックする                            <BR>
         *                (integer,float,double)                 <BR>
         *                                                       <BR>
         * @param 引数:value  入力文字列                                  <BR>
         *                                                       <BR>
         * @return 戻り値 True: はい False: いいえ                         <BR>
         *                                                       <BR>
         * @serialData   2008 08 15                             <BR>
         *********************************************************/
        public static function isHalfNum(str:String):Boolean
        {
            var c:int;
            var retValue:Boolean = true;
            for (var i:int = 0; i < str.length; i++){
                c = str.charCodeAt(i);
                if (!(c >= 0x30 && c <= 0x39)){
                    retValue = false;
                    break;
                }
             }
             return retValue;
        }
        /********************************************************<BR>
         * メソッド名:  isFullKanaCheck                                           <BR>
         * 機能概要:全角カナであるかどうかチェックする                         <BR>
         *                                                       <BR>
         * @param 引数:value  入力文字列                            <BR>
         *                                                       <BR>
         * @return 戻り値 True: はい False: いいえ                         <BR>
         *                                                       <BR>
         * @serialData   2008 08 15                             <BR>
         *********************************************************/
        public static function isFullKana(str:String):Boolean
        {
            var c:int;
            var retValue:Boolean = true;
            for (var i:int = 0; i < str.length; i++)
            {
                var cc:String = str.charAt(i);
                var accChar:String = " ,、,。,,,.,・,:,;,?,!,゛,゜,´,`,¨,^, ̄," +
                        "_,ヽ,ヾ,ゝ,ゞ,〃,仝,々,〆,〇,ー,―,‐,/,\,~,∥,|,…,‥,‘," +
                        "’,“,”,(,),〔,〕,[,],{,},〈,〉,《,》,「,」,『,』,【,】,+,-,±,×,÷," +
                        "=,≠,<,>,≦,≧,∞,∴,♂,♀,°,′,″,℃,¥,$,¢,£,%,#,&,*," +
                        "@,§,☆,★,○,●,◎,◇,◆,□,■,△,▲,▽,▼,※,〒,→,←,↑,↓,〓,∈,∋," +
                        "⊆,⊇,⊂,⊃,∪,∩,∧,∨,¬,⇒,⇔,∀,∃,∠,⊥,⌒,∂,∇,≡,≒,≪,≫," +
                        "√,∽,∝,∵,∫,∬,Å,‰,#,♭,♪,†,‡,¶,◯,";
                if ((accChar.indexOf(cc)) == -1){
                    c = str.charCodeAt(i);
                    if (!((c > 0x30a0) && (c < 0x30ff)) && !((c > 0xff09) && (c < 0xff5b)))
                    {
                        retValue = false;
                        break;
                    }
                }
             }
             return retValue;
        }
        /********************************************************<BR>
         * メソッド名:  isKana                                                   <BR>
         * 機能概要:全角カナであるかどうかチェックする                         <BR>
         *                                                       <BR>
         * @param 引数:value  入力文字列                            <BR>
         *                                                       <BR>
         * @return 戻り値 True: はい False: いいえ                         <BR>
         *                                                       <BR>
         * @serialData   2008 08 15                             <BR>
         *********************************************************/
        public static function isKana(str:String):Boolean
        {
            var c:int;
            var retValue:Boolean = true;
            for (var i:int = 0; i < str.length; i++)
            {
                var cc:String = str.charAt(i);
                c = str.charCodeAt(i);
                if (!((c > 0x30a0) && (c < 0x30ff)) && !((c > 0xff09) && (c < 0xff5b)))
                {
                    retValue = false;
                    break;
                }
             }
             return retValue;
        }
        /********************************************************<BR>
         * メソッド名:  isZenkakuCheck                                           <BR>
         * 機能概要:全角であるかどうかチェックする                         <BR>
         *                                                       <BR>
         * @param 引数:value  入力文字列                                  <BR>
         *                                                       <BR>
         * @return 戻り値 True: はい False: いいえ                         <BR>
         *                                                       <BR>
         * @serialData   2008 08 15                             <BR>
         *********************************************************/
         public static function isZenKaku(str:String):Boolean
        {
            var c:Number;
            var Length:int = 0;
            if(str == null || str.length == 0)
            {
                return true;
            }
            var lineStrs:Array = str.split("/r");
            var lineLength:Number = lineStrs.length;
            if(lineLength != 0)
            {
                for(var i:int = 0; i < lineLength; i++)
                {
                    var strLine:String = lineStrs[i];
                    if(strLine == null || strLine == "")
                    {
                        //continue;
                    }
                    else
                    {
                        for (var j:int = 0; j < strLine.length; j++)
                        {
                            c = strLine.charCodeAt(j);
                            if (!charZenkaku(c))
                                return false;
                        }
                    }
                }
            }
            else
            {
                if(str == null || str == "")
                {
                    //continue;
                } else {
                    for (var n:int = 0; n < str.length; n++)
                    {
                        c = str.charCodeAt(n);
                        if (!charZenkaku(c))
                            return false;
                    }
                }
            }
            return true;
        }
        /********************************************************<BR>
         * メソッド名:  isHalfEng                                               <BR>
         * 機能概要:半角英文字であるかどうかチェックする                     <BR>
         *                                                       <BR>
         * @param 引数:value  入力文字列                                  <BR>
         *                                                       <BR>
         * @return 戻り値 True: はい False: いいえ                         <BR>
         *                                                       <BR>
         * @serialData   2008 08 15                             <BR>
         *********************************************************/
        public static function isHalfEng(str:String):Boolean
        {
            var c:int;
            for (var i:int = 0; i < str.length; i++)
            {
                c = str.charCodeAt(i);
                if (!charHalfEng(c))
                    return false;
             }
             return true;
        }
        /********************************************************<BR>
         * メソッド名:  isHalfLowerEngNum                                       <BR>
         * 機能概要:半角英数文字であるかどうかチェックする                     <BR>
         *                                                       <BR>
         * @param 引数:value  入力文字列                                  <BR>
         *                                                       <BR>
         * @return 戻り値 True: はい False: いいえ                         <BR>
         *                                                       <BR>
         * @serialData   2008 08 15                             <BR>
         *********************************************************/
        public static function isHalfLowerEngNum(str:String):Boolean
        {
            var c:int;
            for (var i:int = 0; i < str.length; i++)
            {
                c = str.charCodeAt(i);
                if (!charHalfNum(c) && !charHalfLowerEng(c))
                    return false;
             }
             return true;
        }
       
        public static function isHalfLowerEngNumAndSingle(str:String):Boolean
        {
            var c:int;
            for (var i:int = 0; i < str.length; i++)
            {
                c = str.charCodeAt(i);
                if (!charHalfNum(c) && !charHalfLowerEng(c)
                && (c != 0x2e)
                && (c != 0x2d)
                && (c != 0x5f))
                    return false;
             }
             return true;
        }
        /********************************************************<BR>
         * メソッド名:  isHalfEngNum                                       <BR>
         * 機能概要:半角英数文字であるかどうかチェックする                     <BR>
         *                                                       <BR>
         * @param 引数:value  入力文字列                                  <BR>
         *                                                       <BR>
         * @return 戻り値 True: はい False: いいえ                         <BR>
         *                                                       <BR>
         * @serialData   2008 08 15                             <BR>
         *********************************************************/
        public static function isHalfEngNum(str:String):Boolean
        {
            var c:int;
            for (var i:int = 0; i < str.length; i++)
            {
                c = str.charCodeAt(i);
                if (!charHalfNum(c) && !charHalfEng(c))
                    return false;
             }
             return true;
        }
        /********************************************************<BR>
         * メソッド名:  isMaxLength                                           <BR>
         * 機能概要:max長チェックする                                     <BR>
         *                                                       <BR>
         * @param 引数:value  入力文字列                                  <BR>
         *                                                       <BR>
         * @return 戻り値 True: はい False: いいえ                         <BR>
         *                                                       <BR>
         * @serialData   2008 08 15                             <BR>
         *********************************************************/
        public static function isMaxLength(str:String,maxLength:int):Boolean
        {
            var c:Number;
            var Length:int = 0;
            for (var i:int = 0; i < str.length; i++){
                c = str.charCodeAt(i);
                if ((c < 128) || ((c > 160) && (c < 224))
                || ((c > 65376) && (c < 65440))){
                    Length++;
                }
                else{
                    Length += 2;
                }
            }
            if (Length > maxLength || Length <= 0 ){
                return false;
            }
            return true;
        }
        private static function charZenkaku(c:Number):Boolean
        {
            return !((c < 128) || (c > 65376 && c < 65440));
        }
        private static function charHalfEng(c:Number):Boolean
        {
            return charHalfLowerEng(c) || charHalfUpperEng(c);
        }
        private static function charHalfLowerEng(c:Number):Boolean
        {
            return (c >= 0x61 && c <= 0x7a);
        }
        private static function charHalfUpperEng(c:Number):Boolean
        {
            return (c >= 0x41 && c <= 0x5a);
        }
        private static function charHalfNum(c:Number):Boolean
        {
            return (c >= 0x30 && c <= 0x39);
        }
    }
}

MsgCodeConst.as
package define
{
    public class MsgCodeConst
    {
        public static const ERR_0001:String = "入力必須項目です";
        public static const ERR_0002:String = "選択必須項目です";
        public static const ERR_0003:String = "半角の文字は使用できません";
        public static const ERR_0004:String = "カタカナ以外の文字は使用できません";
        public static const ERR_0005:String = "使用できない文字が入力されています";
        public static const ERR_0006:String = "数字以外の文字は使用できません";
}

DefineCodeConst.as
package define
{
    public class DefineCodeConst
    {
        public static const PINK_COLOR:String = "#ffe7de";
        public static const BLACK_COLOR:String = "#eeeeee";
        public static const BLANK_COLOR:String = "#FFFFFF";
        public static const AUTOMATIC_INPUT_COLOR:String = "#EEEEEE";
        public static const BACKGROUND_COLOR:String = "backgroundColor";
        public static const BORDER_COLOR:String = "borderColor";
        public static const AUTOMATIC_INPUT:String = "自動入力されます";
    }
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  flex string function date c
相关文章推荐