数字・日付チェックの仕方No.02723
haru さん 01/12/03 10:31
 
いつも、お世話様です。haruです。こんにちは。
早速なんですが、

 $a = input(〜〜〜);

 $a について、標記のチェックをしたいのですが、何か良いものが
あれば紹介して下さい。マクロでも関数でもどちらでも構いません。


 それぞれチェックしたいのですが、

 a には、数字の場合、通常のチェック(マイナス符号、小数点)
と、特殊な場合、\ マーク、カンマ(,)を含む場合があると思いま
す。
 日付は、その区切り文字として、/.が、考えられます。例えば
yy/mm/dd yy.mm.dd 等です。加えて、閏年とか 11月は 31日はあり
えない等もみていただけると、申し分ありません。

 できれば、量の少ない手軽なものが良いんですが。

 勝手なことばかり申し上げてすみません。

よろしくお願いします。

[ ]
RE:02723 数字・日付チェックの仕方No.02724
TAKA さん 01/12/03 12:16
 
TAKA です。

> できれば、量の少ない手軽なものが良いんですが。

量が少ないなら、専用のdllを使う方法がありますが、マクロで実
現するなら、
「hidesoft:4:02650 2001/11/22」スレッド内の
「hidesoft:4:02660 2001/11/22」のマクロで文字列から日付を取り
出すマクロがありますので、それに以下のマクロのサブルーチン
(日付の妥当性)の部分を追加すればよいです。

dllについては、詳しい方からコメントがあると思います。
#杉浦 まさき さんとか。

まあ、日付チェックのみにdllを使う必要性はないとは思いますが。

// テストマクロ(ここから)
//  #Year = 1996; #Month = 2; #Day = 29;   // OK
//  #Year = 2000; #Month = 2; #Day = 29;   // OK
    #Year = 2001; #Month = 2; #Day = 29;   // NG
//  #Year = 2100; #Month = 2; #Day = 29;   // NG
    call DateCheck #Year, #Month, #Day;
    #RC = ##return;
    if( #RC )   message "OK";
    else        message "NG";
    endmacro;

// 日付の妥当性チェック
// ##1:年 ##2:月 ##3:日
// ##return 0:NG 1:OK
DateCheck:
    ##RC = 0;
    if( ( ##2 < 1 ) || ( ##2 > 12 ) )
    { // 月が範囲外
        goto LDateCheck;
    }
    call GetMonthDay ##1, ##2;
    ##Date = ##return;
    if( ( ##3 < 1 ) || ( ##3 > ##Date ) )
    { // 日が範囲外
        goto LDateCheck;
    }
    ##RC = 1;
LDateCheck:
    return ##RC;

// 指定月の日にちを取得
// ##1:年 ##2:月
GetMonthDay:
    ##Tbl[0] = 31;  //  1月
    ##Tbl[1] = 28;  //  2月
    ##Tbl[2] = 31;  //  3月
    ##Tbl[3] = 30;  //  4月
    ##Tbl[4] = 31;  //  5月
    ##Tbl[5] = 30;  //  6月
    ##Tbl[6] = 31;  //  7月
    ##Tbl[7] = 31;  //  8月
    ##Tbl[8] = 30;  //  9月
    ##Tbl[9] = 31;  // 10月
    ##Tbl[10] = 30; // 11月
    ##Tbl[11] = 31; // 12月

    if( ##2 == 2 )
    { // 2月
        call UruuCheck ##1;
        if( ##return )
        { // 閏年
            ##Tbl[1] = 29;
        }
    }

    return ##Tbl[##2-1];

// 閏年チェック
// ##1:年
// ##return 0:閏年でない 1:閏年
UruuCheck:
    ##RC = 0;
    if( ##1 % 4 == 0 )
    { // 4で割り切れる
        if( ##1 % 100 == 0 )
        { // 100で割り切れる
            if( ##1 % 400 == 0 )
            { // 400で割り切れる
                ##RC = 1;
            }
        }
        else
        { // 100で割り切れない
            ##RC = 1;
        }
    }
    return ##RC;
// テストマクロ(ここまで)

[ ]
RE:02723 数字・日付チェックの仕方No.02725
ENCODINGSHIFTJIS さん 01/12/03 12:22
 
日付文字列の解析(パース・デイト)を本格的にしたいのなら
短い行数では、スクリプト言語などを run で外部実行しないと無理では。
適当なDLLは見つかりませんね。

imestate を検査して imeswitch して半角入力を強制した後に
> $a = input(〜〜〜);
してから、
全部、秀丸マクロ内でやりたいですか?完璧は難しい
MM DD YY 型なら WSH で済ませられますが、日本人には
合わないし。

[ ]
RE:02723 数字・日付チェックの仕方No.02726
ひろ さん 01/12/03 17:12
 
 haru さん今日は、ひろです。
>  $a について、標記のチェックをしたいのですが、何か良いものが
> あれば紹介して下さい。マクロでも関数でもどちらでも構いません。
 数字に関しては val 関数を利用したり、hidesoft.4:02710 のスレッドが
参考になると思います。

> 加えて、閏年とか 11月は 31日はあり
> えない等もみていただけると、申し分ありません。
 用途は違いますが、ある年のある月の日数知るには次のようなサブルーチ
ンがあります。
//-------------------------------------------------------------------
call MonthDay val(month), val(year),

MonthDay://ある月の日数 ##1:month ##2:year
//グレゴリオ暦のため 2621 年による補正はしていない
  if(##1 > 7){
    if(##1%2)return 30;
    else return 31;
  }
  else{
    if(##1 == 2){
      if(##2%400 == 0)return 29;
      else if(##2%100 == 0)return 28;
      else if(##2%4 == 0)return 29;
      else return 28;
    }
    if(##1%2)return 31;
    else return 30;
  }

[ ]
RE:02725 数字・日付チェックの仕方No.02727
haru さん 01/12/03 18:18
 
ENCODINGSHIFTJISさん、こんにちは。
早速の御返事、ありがとうございます。

>日付文字列の解析(パース・デイト)を本格的にしたいのなら
>短い行数では、スクリプト言語などを run で外部実行しないと無理では。
>適当なDLLは見つかりませんね。
やはり、そうですよね。私も自分なりに探してみたのですが。

[ ]
RE:02724 数字・日付チェックの仕方No.02728
haru さん 01/12/03 19:01
 
TAKAさん、こんにちは。
早速の御返事、ありがとうございます。

>量が少ないなら、専用のdllを使う方法がありますが、マクロで実
>現するなら、
>「hidesoft:4:02650 2001/11/22」スレッド内の
>「hidesoft:4:02660 2001/11/22」のマクロで文字列から日付を取り
>出すマクロがありますので、それに以下のマクロのサブルーチン
>(日付の妥当性)の部分を追加すればよいです。
ありがとうございます。

>dllについては、詳しい方からコメントがあると思います。
>#杉浦 まさき さんとか。

杉浦 まさき さんの田楽dll(これしか存じ上げないのですが)の説明を拝見し
たんですが、数字・日付チェックともにこれに関する関数は見当たりませんでし
た。あるいはこれらを、組み合わせるとか、又は、別のdllが存在するのでしょ
うか?

[ ]
RE:02726 数字・日付チェックの仕方No.02729
haru さん 01/12/03 19:01
 
ひろさん、こんにちは。
早速の御返事、ありがとうございます。

> 数字に関しては val 関数を利用したり、hidesoft.4:02710 のスレッドが
>参考になると思います。

>> 加えて、閏年とか 11月は 31日はあり
>> えない等もみていただけると、申し分ありません。
> 用途は違いますが、ある年のある月の日数知るには次のようなサブルーチ
>ンがあります。
参考にさせていただきます。

[ ]
RE:02728 数字・日付チェックの仕方No.02730
杉浦 まさき さん 01/12/04 00:35
 
TAKA さん、haru さん、こんばんは。
杉浦 まさき です。

>>dllについては、詳しい方からコメントがあると思います。
>>#杉浦 まさき さんとか。
>杉浦 まさき さんの田楽dll(これしか存じ上げないのですが)の説明を拝見し
>たんですが、数字・日付チェックともにこれに関する関数は見当たりませんでし
>た。あるいはこれらを、組み合わせるとか、又は、別のdllが存在するのでしょ
>うか?

呼ばれて飛び出てジャ…って年がバレますね(苦笑)。

ま、それはともかく、田楽DLLでスピンコントロール
(ある範囲の数値しか受け付けない&上下ボタンで値を変更できる)
を駆使すれば、ある程度はチェックできます。
#2/30 とかありえない日付のチェックは相変わらず
 マクロ側でやる必要がありますが。
それよりは専用の処理を行うDLLを作った方が早いでしょうけど…。
#↑ということでしょうか(^^;?>TAKA さん

#次のバージョンアップの時(Ver.2.XX)に日付・時刻系の関数を
 追加するっちゅ〜手もあるか(笑)。>田楽シリーズ


[ ]
RE:02727 数字・日付チェックの仕方No.02731
encodingshiftjis さん 01/12/04 00:52
 
j.txt の作業面を開いておけるなら、例として

// syllable.mac
// [0-9]+\f[^0-9]+\f[0-9]+\f[^0-9]+\f[0-9]+
// \0 \2 \4
#hwnd0=hidemaruhandle(0);
setactivehidemaru findhidemaru("j.txt");// 作業用開きっぱなし
#hwnd1=hidemaruhandle(0);
setactivehidemaru #hwnd0;
//

$a="01 /-#. 12/.\\:+05 ";// テスト文字列

//       数値取り出しの例  正規表現が使えるのは編集面のみなので
setactivehidemaru #hwnd1;// 作業面に
selectall;insertfix $a;
//
searchdown2 "[0-9]+",regular;
#Y=val(gettext(seltopx,seltopy,selendx,selendy));
searchdown "[^0-9]+",regular;
//
searchdown2 "[0-9]+",regular;
#M=val(gettext(seltopx,seltopy,selendx,selendy));
searchdown "[^0-9]+",regular;
//
searchdown2 "[0-9]+",regular;
#D=val(gettext(seltopx,seltopy,selendx,selendy));
//searchdown "[^0-9]+",regular;
//
menu str(#Y),str(#M),str(#D); // 結果確認
//
setactivehidemaru #hwnd0;// 面復帰
//   カレンダー検査はこの後で
で数値は切り出せます。

[ ]
RE:02730 数字・日付チェックの仕方No.02732
TAKA さん 01/12/04 01:50
 
TAKA です。

>それよりは専用の処理を行うDLLを作った方が早いでしょうけど…。
>#↑ということでしょうか(^^;?>TAKA さん

すんません。何も考えていませんでした。既に、何かあるのか
なーって程度です。
田楽DLLも一度も使ったことないですし。
今は、日付を扱えるものがないのですか。
専用の命令を用意してもよいかも。

[ ]
RE:02730 数字・日付チェックの仕方No.02733
haru さん 01/12/04 08:22
 
>杉浦 まさきさん、こんにちは。

>#次のバージョンアップの時(Ver.2.XX)に日付・時刻系の関数を
> 追加するっちゅ〜手もあるか(笑)。>田楽シリーズ

私はそうしていただけると、非常にありがたいのですが。

[ ]
RE:02731 数字・日付チェックの仕方No.02740
haru さん 01/12/04 16:53
 
>j.txt の作業面を開いておけるなら、例として

参考にさせていただきます。ありがとうございます。

[ ]
RE:02730 数字・日付チェックの仕方No.02741
haru さん 01/12/04 17:06
 
haru です。

>#次のバージョンアップの時(Ver.2.XX)に日付・時刻系の関数を
> 追加するっちゅ〜手もあるか(笑)。>田楽シリーズ

みなさんに色々教えていただきましたが、やはり私には量が多くて
手に負えません。日付・時刻系の関数に加えて、別個に田楽 ddl に、
numeric チェックする関数も入れていただけると、大助かりです。
(そうすれば、5.6行の記述ですみそうなので)

ご検討の程、よろしくお願いします。

[ ]
RE:02741 数字・日付チェックの仕方No.02742
杉浦 まさき さん 01/12/04 23:06
 
ども、杉浦 まさき です。

>みなさんに色々教えていただきましたが、やはり私には量が多くて
>手に負えません。日付・時刻系の関数に加えて、別個に田楽 ddl に、
>numeric チェックする関数も入れていただけると、大助かりです。

ええと、具体的にどういうものがあればいいんでしょうか?

#う〜ん…以後は僕のサポート Web 会議室でやるべきかもしれませんが、
 なるべく多くの意見を伺っておきたいので
 引き続きこちらにツリーを伸ばしますm(_ _)m。>ALL



[ ]
RE:02742 数字・日付チェックの仕方No.02743
haru さん 01/12/05 08:51
 
杉浦 まさきさん、こんにちは。haru です。

やって頂けそうで、大変ありがたく存じます。

>ええと、具体的にどういうものがあればいいんでしょうか?

繰り返しになりますが、私は

 数字の場合、通常のチェック(マイナス符号、小数点)と、特殊
な場合のチェック、\ マーク、カンマ(,)を含む場合があると思い
ます。
 日付は、その区切り文字として、/.が、考えられます。例えば
yy/mm/dd yy.mm.dd 等です。加えて、閏年とか 11月は 31日はあり
えない等もみていただけると、申し分ありません。

と、いう位で構いません。また何かあったら追加させて下さい。

よろしくお願いします。

[ ]
RE:02742 数字・日付チェックの仕方No.02750
ひろ さん 01/12/05 12:30
 
 杉浦さん今日は、ひろです。
> ええと、具体的にどういうものがあればいいんでしょうか?
 自分が実際に使うなら、既にある関数で作ってしまうでしょうが(^^;。

 単純に
yyyy/mm/dd
という形式で、yyyy, mm, dd の部分はスピンコントロールで良いと思いまが、
鶴亀の検索時の時刻設定がベターだと思います。また I.E Ver.3 以上に限定
するなら、カレンダーコントロール
http://msdn.microsoft.com/library/default.asp?url=/library/en-us/shellcc/
platform/CommCtls/MonthCal/MonthCal.asp (←実際は一行)
が使えるそうです。どんな UI にしろ yyyy は ? 以上の 2 桁なら 1900 年
代扱いというようになり (? についてはお任せします。)、dd の部分は直前
の yyyy と mm によって上限が変わると良いと思います。

[ ]
RE:02743 数字・日付チェックの仕方No.02757
杉浦 まさき さん 01/12/06 01:05
 
haru さん、こんばんは。
杉浦 まさき です。

#すんません、ちと長いですm(_ _)m。>ALL

> 数字の場合、通常のチェック(マイナス符号、小数点)と、特殊
>な場合のチェック、\ マーク、カンマ(,)を含む場合があると思い
>ます。

う〜ん、円記号やカンマとかは単純に除去すればOKっぽいですが、
もしそうなら GSUB() で思いつく限りの文字を空文字に置換すれば
今のままのDLLでもいけそうです。

$s = "\\ 12,345,678"; // 元文字列
$s = dllfuncstr("GSUB", $s, " ", "", -1);  // 空白の除去
$s = dllfuncstr("GSUB", $s, "\\", "", -1); // 円記号の除去
$s = dllfuncstr("GSUB", $s, ",", "", -1);  // カンマの除去
// ... とにかくあるだけ繰り返し

いちいち GSUB() を呼び出すのが面倒なら、GETTOKEN() で
セパレータ文字に該当文字を全て指定するという手もあります。
#除去する文字が多い場合はこちらの方が効率的ですね。

$s = "\\ 12,345,678";
$s = dllfuncstr("GETTOKEN", $s, " \\,"); // "12" が入る
while (dllfunc("HASMORETOKENS")) {
  // 以下 "345", "678" が連結される
  $s = $s + dllfuncstr("GETTOKEN", "", " \\,");
}
// $s == "12345678" になっている

で、話が前後してしまいましたが、ここまでの作業で
符号、小数点、数字からなる文字列にできますので、
あとはマクロの val() 関数に渡せば数値として取り出せます。
#小数点ありの数をどうするかは haru さんが何をやりたいかで
 話が変わってくるので、これ以上はコメントできません。


> 日付は、その区切り文字として、/.が、考えられます。例えば
>yy/mm/dd yy.mm.dd 等です。加えて、閏年とか 11月は 31日はあり
>えない等もみていただけると、申し分ありません。

こちらも数値の切り出し作業自体は GETTOKEN() でいけそうなので、
残るのは年月日としてありえるかどうかのチェックだけに
絞れそうですね…。<申し分ないのしか残ってない(笑)

で、これは既に TAKA さんが [02724] にて
チェックマクロを紹介してくださっているので、
結局のところ既存のもので haru さんが望むことは
できるわけですが、さてどうしたもんでしょうか?

それでもDLLの関数がほしい!ということであれば、
日付の妥当性チェックの関数は用意したいですが、
もうちょっと日付関係で(しかもマクロでは無理or大変な)ネタが
あると、作り手としても追加のしがいがあっていいかなぁ…と(笑)。

#余談になりますが、ファイル操作関係で致命的なバグがあったんで
 近日(Ver.1.XX としては最後?の)バージョンアップをします。>鯖&DLL


[ ]
RE:02757 数字・日付チェックの仕方No.02760
haru さん 01/12/06 08:53
 
杉浦 まさきさん、こんにちは。

>チェックマクロを紹介してくださっているので、
>結局のところ既存のもので haru さんが望むことは
>できるわけですが、さてどうしたもんでしょうか?
確かに、そうですので、どうされるかはお任せします。


[ ]
RE:02757 数字・日付チェックの仕方No.02766
山紫水明 さん 01/12/06 20:23
 
 杉浦 まさきさん,こんばんは。いつもお世話になります。

》もうちょっと日付関係で(しかもマクロでは無理or大変な)ネタが
》あると、作り手としても追加のしがいがあっていいかなぁ…と(笑)。

 マクロでやってやれないことはないものばかりですが,次のようなのが
あればと思います。
1.日付から曜日を得る。
2.2つの日付の間の日数を計算する
3.2つの日付+時刻から経過時間を出す(秒の形式でも,時間・分・秒でもよい)
以上が基本的なもので,あと挙げるとすれば,
4.ある日付から任意日数後の日付
5.ある日付+時刻から任意時間後の日付+時刻

 以上のうち,作りがいのあると感じられるものをお願いします。
 一つもなかったりして(^^;

     では, (^^)/~
                                        山紫水明

[ ]
RE:02766 数字・日付チェックの仕方No.02768
ひろ さん 01/12/06 21:52
 
 山紫水明さん今日は、ひろです。
 雑談です。
> 4.ある日付から任意日数後の日付
> 5.ある日付+時刻から任意時間後の日付+時刻
 この 2 つは、サブルーチンのくせにグローバル変数を使うというものです
が、無かったので作りました(^^)。あったら便利だなあ〜。

[ ]
RE:02766 数字・日付チェックの仕方No.02769
杉浦 まさき さん 01/12/07 00:09
 
みなさんこんばんは。
杉浦 まさき です。

> マクロでやってやれないことはないものばかりですが,

ひろさんも作っていらしたみたいですが、今回挙げて頂いたものなら
ほとんど僕の Web ページに数年前からひっそりと(笑)置いてあります。
#お笑いマクロど〜じょ〜のどっかにリンクがあった…かな(^^;?

> 以上のうち,作りがいのあると感じられるものをお願いします。
> 一つもなかったりして(^^;

確かにマクロでやってやれないことはないわけですが、<証明済み(笑)
量的にはまぁまぁのサイズだったりグローバル配列を
内部で使ったりとか色々気に入らない面もあるので、
(全部かどうかはともかく)DLL関数として
取り入れていきたいと思います。

#一方で「関数多すぎて使う気にならないのでは?」という
 ジレンマもあるんですが…う〜む。


[ ]