数値の桁数(文字数)を指定しよう
はいどうも
様々な計算結果を表示させる場合こう思ったことはないでしょうか?
「整数部だけほしい」
「小数点第2位までほしい」
「頭に0を足して2桁表記にしたい・・。」
そしてLuaにはちゃんとそのための関数がご用意されています。
○整数にしよう
・整数にするにはいろいろな方法がありますので、それぞれ目的に合わせて使用しましょう
今回は6パターン比べてみました。
| 5.82 | 3.29 | 0 | -3.29 | -5.82 | |
|---|---|---|---|---|---|
| ①math.floor (x) | 5 | 3 | 0 | -4 | -6 |
| ②math.ceil (x) | 6 | 4 | 0 | -3 | -5 |
| ③string.format("%d",x) | "5" | "3" | "0" | "-3" | "-5" |
| ④string.format("%.0f",x) | "6" | "3" | "0" | "-3" | "-6 |
| ⑤x-(x %1) | 5 | 3 | 0 | -4 | -6 |
| ⑥x-(math.fmod(x,1)) | 6 | 3 | 0 | -3 | -6 |
・お気づきになったかと思いますが string.format を使用したときだけ "" が付いています。
つまり文字として返されています。
数値が欲しいときは tonumber(x) を使うことで、文字から数値へ変換されます。
以下説明
①math.floor (x)
数値「x」に対して、数値「x」以下の値で最大の整数を戻り値として返します。
つまり切り捨てです。
※ただしマイナス値の場合、マイナス寄りの数値が出力されます。
②Math.ceil(x)
数値「x」に対して、数値「x」上の値で最小の整数を戻り値として返します。
つまり切り上げです。
※ただしマイナス値の場合、プラス寄りの数値が出力されます。
③string.format("%d",x)
指定した書籍形式を返します。
今回は「"%d"」を指定しています。
「d」は整数部のみを返すとしています。
④string.format("%.0f",x)
今回は「"%.0f"」を指定しています。
「f」は小数点を含む数値を返します。
「.0」は小数点を0文字返します。
つまり「"%.0f"」とは小数点付の数値を小数点無し(整数のみ)で返します。
なお、小数部は四捨五入されます。
⑤x-(x %1)
割り算のあまりを求めて引算しましょう。
あまりの計算は「 % 」です。
「x % 1」xを1で割った際のあまり。つまり小数部が出てきます。
小数点付の数値から小数部を引くため、整数部のみが出てきます。
⑥x-(math.fmod(x,1))
⑤では「%」であまりを求めましたが、今回は関数のmath.fmod(x,y)を使いましょう。
xをyで割り、0に近いあまりを返します。
○桁数を指定して整数を出力しよう
・表示スタイルの関係や表示桁をそろえるために、
数値の頭に0やスペースを挿入したくなりたく場合があります。
・文字数を求めて0やスペースを挿入して・・といったコードを書いてもいいですが
もっと簡単な方法があります。
・ string.format(formatstring,x) を使用しましょう。
formatstringの部分を何に入れるかによって返ってくる結果が変わります。
␣記号はスペースと解釈してください。
※表では formatstring によって戻り値の文字数指定を5としているため
5文字未満の場合は「0」や「スペース」埋めによって5文字化されます。
文字数指定を5から8へ変えれば、8文字化されます。
文字数指定を超える数値が入力された場合、0埋めなどはされません。
以下説明
①"%05d"
0埋め5文字、整数部のみ の指定です
xが5文字未満の場合、整数部を0埋めして5桁(5文字)にして返します。
符号は5桁(5文字)に含めません。
②"%5d"
スペース埋め5文字、整数部のみ の指定です
xが5文字未満の場合、整数部をスペース埋めして5桁(5文字)にして返します。
ただし5桁(5文字)は 符号を含みます 。
③"%05.0f"
0埋め5文字、小数部を0文字 の指定です
小数部は0文字と指定されているため、小数点第一位を四捨五入します。
その結果が5桁(5文字)未満の場合、0埋めして5桁(5文字)にして返します。
符号は桁数に含めません。
④"%5.0f"
スペース埋め5文字、小数部を0文字 の指定です
小数部は0文字と指定されているため、小数点第一位を四捨五入します。
5桁(5文字)未満の場合、スペース埋めして5桁(5文字)表示します。
ただし5桁(5文字)は 符号を含みます 。
⑤"%05f"
0埋め5文字、小数部は6文字 の指定です
※f指定のみで小数部の桁数が未設定の場合、小数部は6文字と強制されます。
小数部は6文字と指定されているため、小数点第七位を四捨五入します。
小数部だけで5文字を超えるので、整数部を0埋めせず返します。
⑥"%5f"
スペース埋め5文字、小数部は6文字 の指定です
※f指定のみで小数部の桁数が未設定の場合、小数部は6文字と強制されます。
小数部は6文字と指定されているため、小数点第七位を四捨五入します。
小数部だけで5文字を超えるので、整数部をスペース埋めせず返します。
○整数部と小数部の桁を指定して出力しよう
今回もstring.format(formatstring,x) です。
formatstringの部分を何に指定するかによって帰ってくる結果が変わります。
小数点で指定した桁数(文字数)が優先されています。
小数点「.」1桁数(1文字)としてカウントされています。
「%0~」と0埋め指定しなかった場合、符号も桁数(文字数)としてカウントされます。
その後、残った桁数分0またはスペース埋めします。
以下説明 ややこしいので表を見ながら感じて。
①"%05.02f"
0埋め5文字、小数部は2文字 の指定です
小数部を2桁(0埋め)とし2文字、小数点が1文字として消費されます。
そのため整数部が2桁未満の場合は0埋めして2桁の計5文字を返します。
符号は5文字に含めません。
②"%5.2f"
スペース埋め5文字、小数部は2文字 の指定です
小数部を2桁(0埋め)とし2文字、小数点が1文字として消費されます。
そのため整数部が2桁未満の場合はスペース埋めして2桁の計5文字を返します。
符号は5文字に 含みます 。
③"%08.04f"
0埋め8文字、小数部は4文字 の指定です
小数部を4桁(0埋め)とし4文字、小数点が1文字として消費されます。
そのため整数部が3桁未満の場合は0埋めして3桁の計8文字を返します。
符号は8文字に含めません。
④"%8.4f"
スペース埋め8文字、小数部は4文字 の指定です
小数部を4桁(0埋め)とし4文字、小数点が1文字として消費されます。
そのため整数部が3桁未満の場合はスペース埋めして3桁の計8文字を返します。
符号は8文字に 含みます 。
⑤"%010f"
0埋め10文字、小数部は6文字 の指定です
※f指定のみで小数部の桁数が未設定の場合、小数部は6文字と強制されます。
小数部を6桁(0埋め)とし6文字、小数点が1文字として消費されます。
そのため整数部が3桁未満の場合は0埋めして3桁の計10文字を返します。
符号は10文字に含めません。
⑥"%10f"
スペース埋め10文字、小数部は6文字 の指定です
※f指定のみで小数部の桁数が未設定の場合、小数部は6文字と強制されます。
小数部を6桁(0埋め)とし6文字、小数点が1文字として消費されます。
そのため整数部が3桁未満の場合はスペース埋めして3桁の計10文字を返します。
符号は10文字に 含みます 。
まとめ
このように計算をどのように丸めるか、桁表記させるかなど様々な表記があります。
みんなもいろいろな計算をしていろいろな結果を表示させよう!


