>userdef.as
人によってかなり違いそうですよね。
私は内輪向けのツールを作っているのですが、Win32 APIを頻繁に呼び出すのでUMAGODiさんのconstant.asは外せません。
文字列操作が主となるため、joinやsliceなど他の言語で見掛けて便利そうに感じた機能を再現しては書き込んでもいます。
あとはカラーコードでしょうか。LEMON_YELLOWで$FFF450など、色名で定義してあります。
>勉強資料
基礎を身につけるなら公式の解説書がオススメですが、ステップアップという意味では他の人のスクリプトを見せてもらうのが一番上達すると思います。
ただ動かしてみるだけではなく、知らない命令はヘルプで確認する、logmesを挟んで変数の状態を追ってみる、他の書き方ができそうな箇所は差し替えてみる、一見不要そうな処理はコメントアウトしてどういう不具合が起きるのか試してみる、など。
何故これで期待通りの動作になるのだろう? という疑問が解消されるごとに出来ることが増えていきます。
参考にするという観点で言えば、小さな処理の集まりであるモジュールの方が解読しやすいことも多いですよ。
私が言うのもなんですが、処理をモジュール化しているということは初心者を脱しているという証明でもあるので、そこから学べることは多いはずです。
>フランス書式
軽く調べてみましたが、カンマとピリオドが逆転しているもの、更にスペースやアポストロフィで区切るものなど、いくつも組み合わせがあるようですね。
これは個別に対応するより使用時に指定してもらうのが無難でしょうか。
都度変更するものでもないと思うので設定用の命令を追加してみました。
#ifndef Mod_Format_Number
#module Mod_Format_Number
/* 書式を設定する */
#deffunc local _setFormat int _digit, int _separator, int _point
digit = _digit
separator = _separator
point = _point
return
#define global setFormat( %1=3, %2=',', %3='.' ) _setFormat@Mod_Format_Number %1,%2,%3
/* 指定された桁数ごとに区切り記号を打つ */
#defcfunc local _formatNumber
count = len / digit - ( len \ digit == 0 )
offset = len + count
poke integer, offset, 0
offset -= digit
repeat count, 1
memcpy integer, integer, digit, offset, len - digit * cnt
poke integer, offset - 1, separator
offset -= digit + 1
loop
return integer
/* 整数用 */
#defcfunc formatNumber int _value
if _value < 0 {
integer = str( -_value ); 正の値にする
len = strlen( integer )
return "-" + _formatNumber()
} else {
integer = str( _value )
len = strlen( integer )
return _formatNumber()
}
/* 実数用 */
#defcfunc formatNumberF double _value, int _min
decimal = ""
integer = strf( "%." + _min + "f", absf( _value ) ); 四捨五入する
len = instr( integer, 0, "." )
if len == -1 {
len = strlen( integer )
} else {
poke decimal, 0, point; 小数点を打つ
memcpy decimal, integer, _min + 1, 1, len + 1; 少数部(ピリオドの直後からNULまでコピーする)
}
if _value < 0.0 && double( integer ) != 0.0 {
return "-" + _formatNumber() + decimal
} else {
return _formatNumber() + decimal; 四捨五入して0になる場合も符号なし
}
#global
setFormat; 初期設定は3桁/カンマ区切り/ピリオド小数点
#endif
#addition "mod_format_number.as"; 以上のモジュールを別ファイルに保存する場合
*sample
i = 123456789.876543
mes formatNumberF( i, 6 )
mes formatNumberF( -0.1, 0 )
mes formatNumberF( -0.9, 0 )
pos 0, ginfo_cy + ginfo_mesy
setFormat 4; 4桁/カンマ区切り/ピリオド小数点
mes formatNumberF( -i, 7 )
pos 0, ginfo_cy + ginfo_mesy
setFormat 3, '.', ','; 3桁/ピリオド区切り/カンマ小数点
mes formatNumberF( i, 5 )
pos 0, ginfo_cy + ginfo_mesy
setFormat 3, ' '; 3桁/スペース区切り/ピリオド小数点
mes formatNumberF( i, 3 )
pos 0, ginfo_cy + ginfo_mesy
setFormat 3, '\''; 3桁/アポストロフィ区切り/ピリオド小数点
mes formatNumberF( i, 1 )
>NO.100188
formatNumberFで小数点以下が0の場合に必ず正の値で出力されるようになっていたのも修正しました。
加えて、コピペミスがあったため何度か投稿し直しました。
修正前の書き込みを見てくださった方、混乱させてしまい申し訳ありません。