今回は、WebMSX で動作を確認した。
まずは何も工夫せずに出力してみる
PRINT 命令を用いると、指定した数値をテキスト画面に出力することができる。
しかし、なぜか数値の前後に勝手に空白が入ってしまう。
10 N=42
20 PRINT "|";N;"|"
数値を文字列に変換してから出力してみる
STR$ 関数を用いると、引数として渡した数値を文字列に変換することができる。
これを用いて数値を文字列に変換したものを PRINT
命令で出力することで、数値の後ろに余計な空白を入れられるのを回避できた。
しかし、これを用いても、数値の前には空白が入ってしまった。
10 N=42
20 PRINT "|";STR$(N);"|"
余計な空白を直接消して出力してみる
MID$ 関数を用いると、文字列の中の指定した部分を取り出した新しい文字列を得ることができる。
これを用いて、STR$
関数の変換結果の最初の余計な空白を除いた部分を取り出し、出力する。
10 N=42
20 PRINT "|";MID$(STR$(N),2);"|"
一見、うまくいったように見える。
しかし、実は負の数を出力・変換する場合は、前に余計な空白は入らないのである。
そのため、この実装では、負の数の符号が消え、間違った出力になってしまう。
10 FOR N=-3 TO 3
20 PRINT "|";MID$(STR$(N),2);"|"
30 NEXT N
非負の数値しか扱わない場面では、この実装でもよいと考えられる。
負の場合は最初の文字を消さないようにする (完成)
前章の方法では、負の場合は符号が消えて間違った結果になったが、負でない場合は良い結果が得られた。
そこで、負の場合のみ最初の文字を消さないようにすればよい。
MSX BASIC の関係演算子は、真のとき -1
、偽のとき 0
に評価される。
よって、MID$
関数で取り出しを開始する位置として 2
のかわりに 2+(N<0)
を指定すると
-
N
が負であるとき、取り出しを開始する位置は2+(-1)
すなわち1
となり、文字列の先頭から取り出す -
N
が負でないとき、取り出しを開始する位置は2+(0)
すなわち2
となり、最初の1文字を消去する
動作を実現できる。
10 FOR N=-3 TO 3
20 PRINT"|";MID$(STR$(N),2+(N<0));"|"
30 NEXT N
まとめ
- MSX BASIC の
PRINT
命令で非負の数値を出力すると、前後に余計な空白が出力される - 後ろの空白の出力は、数値を文字列に変換してから出力することで回避できる
- 前の空白の位置には負の数値の出力時には符号が入るので、数値が負でない場合のみ最初の文字を除いて出力するとよい
今回は、余計な空白をそもそも出力しないようにする方法を紹介した。
しかし、例えばゲームのスコアを表示するときなど、用途によっては、1桁左から出力するなど、空白が出力されることを前提とし、それ込みで意図した表示になるよう調整するという戦略も考えられるだろう。