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