12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758 |
- # mystrtonum --- convert string to number
- #
- # Arnold Robbins, arnold@skeeve.com, 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])
- # }
|