単位形式
単位形式は、時間間隔、長さや距離、質量や重量など、数値の単位の表示とフォーマットを制御します。
単位形式の理解
単位形式がない場合、数値は単位タイプの全名を表示します。例えば:
put 1 mm --> 1 millimeter
put 3 kg --> 3 kilograms
多くの場合、デフォルトの振る舞いは十分ですが、フォーマットをより制御する必要がある場合もあります。例えば:
put 4425 mins --> 4425 minutes
put 4425 mins as hrs --> 73.75 hours
put 4425 mins as days --> 3.072917 days
単位形式を使用しない場合、4425分を分、または
時間、または
日として表示することしかできません。より良い形式は3日1時間45分かもしれません、これは理解しやすいです。これを達成するために、以下の形式のいずれかを適用できます:
"[day] days [hr] hours [min] minutes"
"[days] @ [hours] @ [minutes] @"
単位形式の要素
単位形式はシンプルからかなり複雑まで様々です。それらを理解する最も簡単な方法は、基本から始めて、必要に応じて他のオプションを追加することです。
基本事項
最も基本的な単位形式は、テキスト文字列で、最終結果中で数値に置き換えられる1つ以上の単位トークン、または単位名が含まれています。単数または複数の単位名を使用することができ、大文字小文字は問題ありません。名前は単位タイプを識別する必要があります。例えば:
put 5 kg -->5 kilograms
put 5 kg with format "[KG] kg" --> 5 kg
put 5 kg with format "[Kilogram] kg" --> 5 kg
put 5 kg with format "[kilograms] kg" --> 5 kg
"@"トークンはより正確な構文を必要とします。詳細は、単位名(@トークン)をご覧ください。
単位形式に複数の単位名が含まれている場合、SenseTalkは左から右へと動作し、それぞれのトークンを数値の合計がそのタイプの単位の整数部分となるように置き換えます。次の例では、SenseTalkは:
- 483秒が8.05 分であると判断します。
[min]
トークンを整数部分8で置き換えます。- 余りの0.05分、つまり3秒を次のトークンに割り当てます。
put 483 secs format "[min] minutes [s] seconds" --> 8 minutes 3 seconds
左から右への値の割り当ては、単位フォーマットシステムが、大きい単位から始まり、次第に小さくなる単位で形成された値を生成できることを意味します。
トークン内の単位名
前述の通り、単位トークン、または単位名の構文は柔軟です。単数名、複数名、または略語を含めることができます。例えば、時間を表す単位トークンを[hours]
または[hour]
または[hrs]
または[hr]
と書くことができます。次の単位形式文字列は少し異なって見えますが、同じフォーマットを適用します。
"[hr]:[min]:[sec]"
"[hours]:[minutes]:[seconds]"
...結果として
3 seconds --> 0:0:3
521957 seconds --> 144:59:17
数値形式
数値形式は、整数部分または小数部分、桁数や小数点以下の位数を制御することができます。次の例では、[seconds .]
内のドットは、秒単位の小数部分を表示することを可能にします:
"[hours]:[minutes]:[seconds .]"
...結果として
63.6487 seconds --> 0:1:3.6487
ドットを使用できるのは、フォーマットの最終単位トークンだけです。これは、値の残りがより大きな単位トークンまたはタイプに割り当てられた後の残りの値です。"."は、0.######
の数値形式を使用することと同じです。
[seconds .###]
内の.###
は、秒単位の小数部分を三桁まで表示します:
"[hours]:[minutes]:[seconds .###]"
...結果として
63.6487 seconds --> 0:1:3.649
[minutes 00]
内の00
は、この単位タイプに対して2桁を表示し、ゼロ分であっても表示します。[seconds 00]
内の00.000
は、小数点前に2桁、小数点後に3桁を表示し、秒単位の小数部分またはゼロを表示します:
"[hours]:[minutes 00]:[seconds 00.000]"
...結果として
63.6487 seconds —> 0:01:03.649
2.4 seconds —> 0:00:02.400
小数部分のフォーマットは、フォーマットの最終単位トークンにのみ適用できます。これは、値の残りがより大きな単位トークンまたはタイプに割り当てられた後の残りの値です。
また、単位形式のグローバルプロパティを使用して、一つ以上の単位タイプの数値形式を設定することもできます。
デフォルトの数値形式
単位トークンが数値形式を含まない場合、デフォルトは0
となります。このデフォルトを現在のトークンおよびすべての後続トークンで上書きするには、アスタリスク(*
)を使用します:
"[hours 00*]:[minutes]:[seconds]"
...これはデフォルトの数値形式を00に設定し、次のように等価です:
"[hours 00]:[minutes 00]:[seconds 00]"
単位名(@tokens)
(@
)記号は、単位形式内の単位名トークンの後に表示される特殊なトークンです。形式が適用されると、この特殊トークンは自動的に単位名の正しい単数形または複数形に置き換えられます:
"[hours] @ and [minutes] @"
...結果として
347 minutes --> 5 hours and 47 minutes
12 minutes --> 0 hours and 12 minutes
60 minutes --> 1 hour and 0 minutes
さらに、(@
)記号の前にあるトークンの単位名は、値に適用され、省略形や大文字化の変更も含まれます:
"[hr] @ and [Minutes] @"
...結果として
347 minutes --> 5 hrs and 47 Minutes
12 minutes --> 0 hrs and 12 Minutes
61 minutes --> 1 hr and 1 Minute
条件部分
単位トークン内の疑問符 は、条件付きの単位を示します。これにより、値がゼロの場合に単位を抑制することができます。例えば:
"[hours ?] @ [minutes?] @"
...結果として
347 minutes --> 5 hours 47 minutes
12 minutes --> 12 minutes
60 minutes --> 1 hour
この形式が1分未満の数値に適用された場合、両方の単位が抑制され、結果は空の文字列になります。
条件ユニットの値がゼロである場合、そのユニットに続くテキストも抑制されます:
"[hours?] grueling @ and [minutes] @"
...という結果になります
347分 --> 5 grueling hours and 47分
75分 --> 1 grueling hour and 15分
12分 --> 12分
この形式を適用するために、システムはそれをセグメントに分解し、各単位トークンに一つのセグメントを割り当てます:
[hours?] grueling @
[minutes] @
.
hours
の後ろのクエスチョンマークはこのセグメントを条件付きにします。時間の数がゼロであれば、その全セグメントは省かれます。
相互に排他的な代替形式
垂直バー(|
)は相互に排他的な形式を分けます。最初の形式がゼロを返すと、次が試され、その後単位タイプが1つだけに適用される形式が適用されるまで続きます。例えば:
"[miles] @|[yards] @|[feet] @|[inches] @"
...という結果になります
72インチ --> 2ヤード
24インチ --> 2フィート
8インチ --> 8インチ
例の単位形式文字列が数値43インチに適用された場合、以下の形式が順番に確認されます:
[miles]
- 43インチは1マイル未満なので、このセグメントはスキップされます。[yards]
- 43インチは1ヤード以上なので、このセグメントが使われ、残りのセグメント、[feet]
と[inches]
は無視されます。
結果は1 yard
です。
相互に排他的な形式は、バイトサイズの表示に便利です。例えば、最適な単位でファイルサイズを表示するために:
"[GB? 0.#] @|[MB? 0.#] @|[KB? 0.#] @|[Byte] @"
...という結果になります
3774875バイト --> 3.6 MB
この場合、クエスチョンマークが必要です。なぜなら、数字の形式には小数点が含まれているからです。クエスチョンマークがなければ、全ての値がGBとして表示されます、それが1GB未満であっても。クエスチョンマークがあれば、その形式が適用されるには数値が少なくとも1GBでなければなりません。
代替形式内のサブセグメント
より多くの単位タイプのフォーマットを可能にするために、各代替形式はサブセグメントを含むことができます。例えば、以下の単位形式文字列には、より大きな単位とより小さな単位の長さに対する二つの代替形式が含まれており、それぞれに二つの単位サブセグメントがあります:
"[mi?] @ [yd] @|[ft?] @ [in] @"