入力値の前処理

文字数に制限を

 ユーザーが入力した文字に制限を持たせたいことはかなりあると思います。
 まずは、文字数を制限するスクリプト。

askText of "5文字までで入力してください" to 5

on askText of thePrompt to theNumber
	repeat
		set theString to text returned of (display dialog thePrompt default answer "")
		if number of theString <= theNumber then exit repeat
	end repeat
	return theString
end askText

 判定の部分を変えれば、a文字以上b文字以下のような条件も簡単に対応できます。

数字だけ入力させる

 数字を入力してもらいたい場合にdisplay dialog命令を利用することは良くありますが、数字を入力して欲しいのに、別の文字列を入力されてエラーとなる、なんてこともありがちです。
 文字列を数字に変換した時にエラーが出れば、それは数字では無いということです。この場合全角文字の数字も数字では無いと判断されます。

askNumber("数字を入力してください")

on askNumber(thePrompt)
	repeat
		set theString to text returned of (display dialog thePrompt default answer "")
		try
			set theNum to theString as number
			exit repeat
		on error
		end try
	end repeat
	return theNum
end askNumber

全角と半角を置き換える

 全角数字を半角に変えておく場合、以下のような置換を上のスクリプトのtryの直前に入れて使えばいいでしょう。

dbyte2Sbyte("−82.3")

on dbyte2Sbyte(theStr)
	set theList to characters of theStr
	repeat with curItem in theList
		set n to (offset of curItem in "0123456789.−+")
		if n > 0 then set contents of curItem to character n of "0123456789.-+"
	end repeat
	return theList as string
end dbyte2Sbyte

 分りにくいのは「contents of curItem」の部分でしょうか。curItemには値そのものでは無く参照が入っているので、contents属性を書き換えることによって、直接theListの中身を書き換えることができます。
 半角カナを全角に変えるのも、上のスクリプトの応用で可能です。
 以下インターネット上なんで半角カナは使ってませんので、適当なものに置き換えて下さい。

sbyte2Dbyte("ここに半角カナ混じりの文字列を")

on sbyte2Dbyte(theStr)
	set theList to characters of theStr
	repeat with curItem in theList
		set n to (offset of curItem in "この部分は、直後の行の文字列を半角にしたものをおいて下さい。")
		if n > 0 then set contents of curItem to character n of "アイウエオカキクケコサシスセソタチツテトナニヌネノハヒフヘホマミムメモヤユヨワヲン゛゜「」。、ァゥェォャュョッ"
	end repeat
	return theList as string
end sbyte2Dbyte

全角と半角を無視する

 SHUICHI.Tさんから、さらに簡単な方法を教えてもらったので、それも紹介します。いや、うちのTips読んでるよかSHUICHI.T による AppleScript 理論にいった方がいいかも。
 さて、その方法とはignoring文を利用するというもので、実は特にAppleScript Language Guideには書いてないのですが、引数に «constant conszkhk»と書く事で全角と半角を無視する事ができます。
 ちなみに、conszkhkはconsidering zenkaku hankakuの略だと思います。
 «はOpt+\(またはOpt+])、»はOpt+Sft+\(またはOpt+Sft+])で入力する特種記号です。
 それでは「数字だけ入力させる」で作ったハンドラを書き換えてみましょう。

askNumber("数字を入力してください")

on askNumber(thePrompt)
	repeat
		set theString to text returned of (display dialog thePrompt default answer "")
		try
			ignoring «constant conszkhk»
				set theNum to theString as number
			end ignoring
			exit repeat
		on error
		end try
	end repeat
	return theNum
end askNumber

 全角数字を入力してもちゃんと数値に変換されます。これはラクチンですね。

前処理の必然性

 私は、全然入力した値を処理しないことが多いのですが、それでも問題ない理由として、個人で使うので間違えて入力することが無いということと、エラーを出したところで致命的なことにならない処理なので、そもそもエラーを気にする必要が無いと言うことがあります。
 そもそも作業を楽にすることが目的であることが多いAppleScriptでは、エラー処理はやらないで良いのならばやらないというスタンスが、正しいことが多いといえます。なんせ、楽をしようとして、よけい苦労しては本末転倒ですから。

 もう一つ楽をする方法として、Tanaka's osaxのMT Swap charactersを使えば、文字列中の特定文字の変換が可能です。また、CGIで使われるURLやMIMEのエンコードも可能です。


2000-05-28 -2000-05-31