誰でも私を助けることができるかどうか疑問に思います。たぶん、ソースコードに何か隠しているかもしれません。残念ながら、私はこの問題の原因を特定するためにCについて十分に知りません。
この動作を説明するために、次のawkスクリプトをテストツールとして実行しました。
#! /usr/bin/env -S awk -E
BEGIN {
OFMT = "%2.3e"
CONVFMT = "%2.3e"
print "gawk version:", PROCINFO["version"]
}
{
for (f=1; f<=NF; f++) {
print ""
print "No modification:", typeof($f), $f
print "Casting strnum to number via OFMT (" OFMT ") with 0+$" f ":",
typeof(0+$f), 0+$f
print "Casting strnum to string via CONVFMT (" CONVFMT ") with \"\" 0+$" f ":",
typeof("" 0+$f), "" 0+$f
print "Using strtonum():", strtonum($f)
printf "Explicitly formatting as %%2.3e using printf: %2.3e\n", $f
}
print ""
# "Born" a number (i.e., no conversion from strnum)
x = 32553225
print typeof(x), x
# Now give it a fractional part
x += 0.1
print typeof(x), x
}
$ ./ofmt_test.awk <<< '236437734634 236437734634.000 236437734634.001'
gawk version: 4.2.1
No modification: strnum 236437734634
Casting strnum to number via OFMT (%2.3e) with 0+$1: number 236437734634
Casting strnum to string via CONVFMT (%2.3e) with "" 0+$1: string 236437734634
Using strtonum(): 236437734634
Explicitly formatting as %2.3e using printf: 2.364e+11
No modification: strnum 236437734634.000
Casting strnum to number via OFMT (%2.3e) with 0+$2: number 236437734634
Casting strnum to string via CONVFMT (%2.3e) with "" 0+$2: string 236437734634
Using strtonum(): 236437734634
Explicitly formatting as %2.3e using printf: 2.364e+11
No modification: strnum 236437734634.001
Casting strnum to number via OFMT (%2.3e) with 0+$3: number 2.364e+11
Casting strnum to string via CONVFMT (%2.3e) with "" 0+$3: string 2.364e+11
Using strtonum(): 2.364e+11
Explicitly formatting as %2.3e using printf: 2.364e+11
number 32553225
number 3.255e+07
したがって、OFMT
最初の大きな数字(236437734634
)には影響はありませんが、printfステートメントで明示的な変換を実行することは可能です。だから.000
効果がない少数の部分を追加しました。その後、反対方向に変更しましたが、今は以前.001
は動作していなかったすべてがOFMT
機能しますか?
strnum
原因に変換を排除するために、最後に「スタンドアロン」テストケースを追加しました。しかし、同じ効果が発生します。
これには小数点の後のゼロ以外の小数部が必要ですOFMT
が、明示的な型変換には必要ありません%e
。
ベストアンサー1
私はこれをCONVFMT
約見ました。POSIX 拡張の説明:
整数値とまったく同じ数値(参照: ISO C規格から派生した概念)は呼び出しと同じように文字列に変換する必要があります。スプリント機能機能(参照 文字列関数)文字列を
"%d"
次のように使用するFMMTパラメーターの合計は、最初と唯一の数値に変換されます。表現 議論。他の数値は呼び出しと同じように文字列に変換する必要があります。スプリント機能関数と変数の値畳み込みFMT〜のようにFMMTパラメーターの合計は、最初と唯一の数値に変換されます。表現議論。
これはここと関連セクションで見られるものをほとんど説明します。出力文:
すべての式引数は文字列として処理し、必要に応じて変換する必要があります。awkの表現、例外は印刷機能形式は直交周波数領域変調 値の代わりに使用する必要があります。畳み込みFMT。
だから我々はそれを持っています。