ACCESS標準の書式設定ではちょっと難しい案件なので文字として整形してしまいます
Left(
[丸めた数量]+0.001 :0詰めをして小数点3桁にそろえた文字
,InStr([丸めた数量] & ".",".") :小数点の位置
+IIf([商品区分]="燃料油",2,-1) :条件に合わせて+2(小数点以下2桁)/-1(整数)
)
登録するデータはある程度入力ルールが決まっていると思いますが、単純に数値とするといろいろな入力が考えられます
| パターン | 1 | 2 | 3 | 4 | 5 | 6 | ←文字位置 |
|---|---|---|---|---|---|---|---|
| A | 4 | ||||||
| B | 2 | 4 | . | 1 | 3 | ||
| C | 2 | 4 | . | 1 | |||
| D | 9 | . | 5 | 4 | 3 | ||
| E | 2 | 4 | . | 9 | 9 | 9 |
ほしい結果は2パターンで
Ⅰ:先頭から小数点の前の文字まで
Ⅱ:先頭から小数点の2文字先まで
先頭から文字列を抜き出せばいいのでLeft関数を使ってそれぞれ
Ⅰ:Left( 基準の文字列, 先頭から小数点の2文字先まで)
Ⅱ:Left( 基準の文字列, 先頭から小数点の前の文字まで)
を作ります
基準の文字列
文字列として処理するので丸め処理をした数値を基にします
注意が必要なのは、上記A、Cパターンで、小数点以下2桁までほしいのに文字列としては桁数が足りません。そこで、元の数値に影響なく、桁が足りないデータに対しては0で埋められるように[丸めた数量]+0.001と計算させています。丸め処理済みであれば数値のない小数点以下第3桁に1を加えても影響がでません
逆に丸め処理が済んでいない場合、例えばEパターンにこのような計算式を当ててしまうと基にすべき数値が変わってしまうので注意が必要です
先頭から小数点
InStr関数で文字位置を調べればいいですね。ただし、整数のデータには小数点がないので、小数点があると仮定した位置を返すように、[丸めた数量] & "."を元のデータとして"."を探すようにします
の2文字先まで/の前の文字まで
単純に+2/-1でいいので、これをIIf関数で条件を付けて切り替えます
通報 ...