X-Git-Url: https://git.xandkar.net/?a=blobdiff_plain;f=x2%2Fsrc%2Fawk%2Flib%2Fnum.awk;fp=x2%2Fsrc%2Fawk%2Flib%2Fnum.awk;h=4c22f9d676b7f172d8e9ba785fc3170b6a761018;hb=499c58a269a00e031302938b5a8f006f23aae451;hp=0000000000000000000000000000000000000000;hpb=4c703fadbdc17d1753d16841582636598f862416;p=khatus.git diff --git a/x2/src/awk/lib/num.awk b/x2/src/awk/lib/num.awk new file mode 100644 index 0000000..4c22f9d --- /dev/null +++ b/x2/src/awk/lib/num.awk @@ -0,0 +1,37 @@ +function num_round(n) { + return int(n + 0.5) +} + +function num_ensure_numeric(n) { + return n + 0 +} + +#----------------------------------- +# Why do we need num_ensure_numeric? +#----------------------------------- +# awk appears to be guessing the type of an inputted scalar based on usage, so +# if we read-in a number, but did not use it in any numeric operations, but did +# use as a string (even in just a format string!) - it will be treated as a +# string and can lead to REALLY SURPRISING behavior in conditional statements, +# where smaller number may compare as greater than the bigger ones, such as. +# +# Demo: +# +# $ awk 'BEGIN {x = "75"; y = "100"; sprintf("x: %d, y: %d\n", x, y); if (x > y) {print "75 > 100"} else if (x < y) {print "75 < 100"}}' +# 75 < 100 +# $ awk 'BEGIN {x = "75"; y = "100"; sprintf("x: %s, y: %d\n", x, y); if (x > y) {print "75 > 100"} else if (x < y) {print "75 < 100"}}' +# 75 > 100 + +# However, once used as a number, seems to stay that way even after being +# used as string: +# +# $ awk 'BEGIN {x = "75"; y = "100"; x + y; sprintf("x: %s, y: %d\n", x, y); if (x > y) {print "75 > 100"} else if (x < y) {print "75 < 100"}}' +# 75 < 100 +# +# $ awk 'BEGIN {x = "75"; y = "100"; x + y; sprintf("x: %s, y: %d\n", x, y); z = x y; if (x > y) {print "75 > 100"} else if (x < y) {print "75 < 100"}}' +# 75 < 100 +# +# $ awk 'BEGIN {x = "75"; y = "100"; x + y; z = x y; if (x > y) {print "75 > 100"} else if (x < y) {print "75 < 100"}}' +# 75 < 100 +# $ awk 'BEGIN {x = "75"; y = "100"; z = x y; if (x > y) {print "75 > 100"} else if (x < y) {print "75 < 100"}}' +# 75 > 100