# mystrtonum --- convert string to number | |
# | |
# Arnold Robbins, [email protected], Public Domain | |
# February, 2004 | |
# Revised June, 2014 | |
function mystrtonum(str, ret, n, i, k, c) | |
{ | |
if (str ~ /^0[0-7]*$/) { | |
# octal | |
n = length(str) | |
ret = 0 | |
for (i = 1; i <= n; i++) { | |
c = substr(str, i, 1) | |
# index() returns 0 if c not in string, | |
# includes c == "0" | |
k = index("1234567", c) | |
ret = ret * 8 + k | |
} | |
} else if (str ~ /^0[xX][[:xdigit:]]+$/) { | |
# hexadecimal | |
str = substr(str, 3) # lop off leading 0x | |
n = length(str) | |
ret = 0 | |
for (i = 1; i <= n; i++) { | |
c = substr(str, i, 1) | |
c = tolower(c) | |
# index() returns 0 if c not in string, | |
# includes c == "0" | |
k = index("123456789abcdef", c) | |
ret = ret * 16 + k | |
} | |
} else if (str ~ \ | |
/^[-+]?([0-9]+([.][0-9]*([Ee][0-9]+)?)?|([.][0-9]+([Ee][-+]?[0-9]+)?))$/) { | |
# decimal number, possibly floating point | |
ret = str + 0 | |
} else | |
ret = "NOT-A-NUMBER" | |
return ret | |
} | |
# BEGIN { # gawk test harness | |
# a[1] = "25" | |
# a[2] = ".31" | |
# a[3] = "0123" | |
# a[4] = "0xdeadBEEF" | |
# a[5] = "123.45" | |
# a[6] = "1.e3" | |
# a[7] = "1.32" | |
# a[8] = "1.32E2" | |
# | |
# for (i = 1; i in a; i++) | |
# print a[i], strtonum(a[i]), mystrtonum(a[i]) | |
# } | |