値の変換
こうした変換がいつどのように行われるか、そのフォーマッティングをコントロールするグローバルプロパティは何かを理解しておくと、この変換プロセスを必要なときに操作することができます。
自動変換
SenseTalkは、必要に応じて値を適切な内部表現へと自動変換します。算術演算、例えば、加算を行う場合、足し合わされる2つの値は数値として評価されます。結果として得られる値は、テキストとして必要になるまで、内部で数値形式で保持されます。
ほとんどの場合、SenseTalkによる値の自動変換で目的は達成され、希望する結果が得られますが、 時には例外もあり得ますので、こうした変換が行われるタイミングとその操作方法を理解しておくことは有用です。次の例を考えてみましょう。
put ((1 + 2) & 4) + 5
この文が実行されると、SenseTalkはまず数値1と2を足して値3を導き出し、これを一時的に数値として格納します。次に実行される演算は、この値と4の連結です。これはテキスト演算ですので、どちらの値もテキスト表現に変換されてから、1つのテキスト文字列に結合されます。最後に、この結果が再び数値に変換されて、数値5を加えることが可能になります。
表示される最終結果は39になるでしょう。本当に、そうなるでしょうか?蓋を開けてみると、実際の結果には、39、309、3009他、いくつかの可能性があり得ます。または、この文が実行されるときのthe numberFormatプロパティの設定によっては、エラーが出るかもしれません。なぜこのようなことが起こるのでしょう?
考慮すべきは、数値をテキスト表現に変換するときのフォーマット方法(表示する小数位の数、先行ゼロを表示するかどうか、など)が、the numberFormatプロパティ(詳細はグローバルプロパティとローカルプロパティの値を参照)によってコントロールされているということです。先の例では、数値3と4が連結のためにテキスト形式に変換されていました。the numberFormatプロパティのデフォルト設定では、これらの数値はテキスト文字列「3」と「4」に変換され、連結されてテキスト「34」になります。ここで、先行ゼロ(例えば、「00」設定)を含んだnumberFormatが使用されると、数値3と4が「03」と「04」というテキスト形式で表現され、「0304」として連結されます。5を加えるため、この文字列は数値(304)に変換され、最終的に309という結果が出されることになります。
日付/時刻値、または値の完全なリスト/プロパティリストとして内部に格納されていた値をテキストフォーマットで求める場合にも、同様の変換が起こります。
バイナリデータ変換
ファイルにアクセスする際に as dataと指定すると、「ロー(生)」バイトデータを含んだバイナリフォーマットでデータをファイルから読み出すことができます。
put file "/tmp/aFile" as data into dataBytes
あるバイト範囲をデータから抽出するといった一部の演算では、ローフォーマットのデータが使われます。
put bytes 1 to 4 of dataBytes into firstBytes
値の表示のようなその他の演算では、データがテキストに自動変換されます。バイナリデータとテキスト間の変換時に、データを文字としてインタープリットしたり、(反対に)テキストの文字をデータとしてエンコードしたりするのに使われるのは、the defaultStringEncodingです。
明示変換
the numberFormatなどのプロパティを使うと、テキストに変換されたときに値が取る形式はコントロールできますが、変換が行われるタイミングについてはコントロールできません。次の短いスクリプトを見てみましょう。
set amount1 to 33
set amount2 to 44
set the numberFormat to "0.00"
put amount1 + amount2 into total
displayOutput total-- ここではthe numberFormatが適用されません
displayOutput total as text-- ここではtotalをテキストにすることによってthe numberFormatを適用させています
to displayOutput of something
put "The value is: " & something
end displayOutput
小数第2位でフォーマットされた形でtotalをdisplayOutputコマンドに渡したい場合、上記の最初のdisplayOutput 呼び出し例ではうまくいきません。問題は、totalが内部で数値として表現され、数値形式でdisplayOutputに渡されることです。ここでは、最終的なフォーマット方法を決定するのはdisplayOutputハンドラのthe numberFormatになります。ローカルのthe numberFormat設定を用いて数値をテキストに変換させるためには、上記の2番目のdisplayOutput呼び出し例のように、as text演算子を使用します。
同様に、as number、as date、as time、as data、as color演算子や、関連するasText()、asNumber()、asDate()、asTime()、asData()、asColor()関数を使用して、明示的に各フォーマットで値を評価させることも可能です。
関連するグローバルプロパティ
numberWords、ordinalWords、timeInterval、timeIntervalWords、byteSizeおよびbyteSizeWords関数
挙動:数値、時間間隔(秒単位)、またはファイルサイズ(バイト単位)を語句によるわかりやすい形式に変換する関数です。これらの関数(ordinalWordsを除く)から得られるテキストは、後に説明するvalue()関数で再び数値に変換することができます。
例:
put numberWords(90) -- "ninety"
例:
put numberWords(427.8) -- "four hundred twenty-seven point eight"
例:
put ordinalWords(90) -- "ninetieth"
例:
put timeInterval(90) -- "1 minute 30 seconds"
例:
put timeIntervalWords(90) -- "one minute thirty seconds"
例:
put timeIntervalWords(11520) -- "three hours twelve minutes"
例:
put byteSize(5242880) -- "5 megabytes"
例:
put byteSizeWords(90) -- "ninety bytes"
その他の値変換
数値、リスト、プロパティリストの他にも、非テキストの内部表現を持つ値はいくつかあります。これらの内部値は、必要に応じてテキストに自動変換されます。このセクションで取り上げた値の型以外に、日付、時刻、カラー値などを表現する値があります。また、あるフォーマットから別のフォーマットに明示的に値を変換する際に使えるフォーマッティング関数で、ここに挙がっていないものもいくつか存在します。
カラー値は、内部でバイナリフォーマットで表現されている場合があります。これを表示したり、テキストに変換したりするときは、the colorFormatグローバルプロパティの現在の設定を使ってフォーマットを操作します。カラーについては、SenseTalkにおけるカラー値で詳しく説明します。
SenseTalkにおける日付および時刻値は、実際の日付/時刻値と、必要なときにその値をテキストに変換するためのテキストフォーマットの両方を含んだ内部フォーマットで表現されている場合が多いです。日付/時刻値のフォーマットを別のフォーマットに変換するときは、formattedTime関数またはconvertコマンドを、the timeFormatグローバルプロパティの設定と一緒に使用します。日付および時刻については、SenseTalkにおける日付および時刻値で詳しく説明します。
merge()およびformat()関数(テキストおよびデータ操作を参照)は、非常に汎用性の高い関数で、多様な一般のフォーマッティングニーズに使用することが可能です。同じセクションに説明されているstandardFormat()関数は、アーカイブに適したテキストフォーマットへ値を変換する際に便利です。
JSONFormat()およびJSONValue()関数は、JSONとSenseTalk間でテキストデータの変換を行うときに使用できます。
XMLRPCFormat()およびXMLRPCValue()関数は、XML-RPCとSenseTalk間でテキストデータの変換を行うときに使用できます。