| 1 |
# strtonum --- convert string to number |
| 2 |
|
| 3 |
# |
| 4 |
# Arnold Robbins, arnold@skeeve.com, Public Domain |
| 5 |
# February, 2004 |
| 6 |
|
| 7 |
function mystrtonum(str, ret, chars, n, i, k, c) |
| 8 |
{ |
| 9 |
if (str ~ /^0[0-7]*$/) { |
| 10 |
# octal |
| 11 |
n = length(str) |
| 12 |
ret = 0 |
| 13 |
for (i = 1; i <= n; i++) { |
| 14 |
c = substr(str, i, 1) |
| 15 |
if ((k = index("01234567", c)) > 0) |
| 16 |
k-- # adjust for 1-basing in awk |
| 17 |
|
| 18 |
ret = ret * 8 + k |
| 19 |
} |
| 20 |
} else if (str ~ /^0[xX][0-9a-fA-f]+/) { |
| 21 |
# hexadecimal |
| 22 |
str = substr(str, 3) # lop off leading 0x |
| 23 |
n = length(str) |
| 24 |
ret = 0 |
| 25 |
for (i = 1; i <= n; i++) { |
| 26 |
c = substr(str, i, 1) |
| 27 |
c = tolower(c) |
| 28 |
if ((k = index("0123456789", c)) > 0) |
| 29 |
k-- # adjust for 1-basing in awk |
| 30 |
else if ((k = index("abcdef", c)) > 0) |
| 31 |
k += 9 |
| 32 |
|
| 33 |
ret = ret * 16 + k |
| 34 |
} |
| 35 |
} else if (str ~ /^[-+]?([0-9]+([.][0-9]*([Ee][0-9]+)?)?|([.][0-9]+([Ee][-+]?[0-9]+)?))$/) { |
| 36 |
# decimal number, possibly floating point |
| 37 |
ret = str + 0 |
| 38 |
} else |
| 39 |
ret = "NOT-A-NUMBER" |
| 40 |
|
| 41 |
return ret |
| 42 |
} |
| 43 |
|
| 44 |
# BEGIN { # gawk test harness |
| 45 |
# a[1] = "25" |
| 46 |
# a[2] = ".31" |
| 47 |
# a[3] = "0123" |
| 48 |
# a[4] = "0xdeadBEEF" |
| 49 |
# a[5] = "123.45" |
| 50 |
# a[6] = "1.e3" |
| 51 |
# a[7] = "1.32" |
| 52 |
# a[7] = "1.32E2" |
| 53 |
# |
| 54 |
# for (i = 1; i in a; i++) |
| 55 |
# print a[i], strtonum(a[i]), mystrtonum(a[i]) |
| 56 |
# } |