O Awk tem 4 tipos : "number", "string", "string numérica" e "indefinido". Aqui é uma função para detectar isso:
function o_class(obj, q, x, z) {
q = CONVFMT
CONVFMT = "% g"
split(" " obj "" obj, x, "")
x[1] = obj == x[1]
x[2] = obj == x[2]
x[3] = obj == 0
x[4] = obj "" == +obj
CONVFMT = q
z["0001"] = z["1101"] = z["1111"] = "number"
z["0100"] = z["0101"] = z["0111"] = "string"
z["1100"] = z["1110"] = "strnum"
z["0110"] = "undefined"
return z[x[1] x[2] x[3] x[4]]
}
Para o terceiro argumento de split
, você precisa de algo que não seja um espaço e
não faz parte de obj
ou será tratado como um delimitador. Eu escolhi
com base na sugestão de Stéphane . A função faz internamente
CONVFMT
alternando, por isso deve retornar o resultado correto, independentemente do valor CONVFMT
no momento da chamada de função:
split("12345.6", q); print 1, o_class(q[1])
CONVFMT = "%.5g"; split("12345.6", q); print 2, o_class(q[1])
split("nan", q); print 3, o_class(q[1])
CONVFMT = "%.6G"; split("nan", q); print 4, o_class(q[1])
Resultado:
1 strnum
2 strnum
3 strnum
4 strnum
Suíte de testes completa:
print 1, o_class(0)
print 2, o_class(1)
print 3, o_class(123456.7)
print 4, o_class(1234567.8)
print 5, o_class(+"inf")
print 6, o_class(+"nan")
print 7, o_class("")
print 8, o_class("0")
print 9, o_class("1")
print 10, o_class("inf")
print 11, o_class("nan")
split("00", q); print 12, o_class(q[1])
split("01", q); print 13, o_class(q[1])
split("nan", q); print 14, o_class(q[1])
split("12345.6", q); print 15, o_class(q[1])
print 16, o_class()
Resultado:
1 number
2 number
3 number
4 number
5 number
6 number
7 string
8 string
9 string
10 string
11 string
12 strnum
13 strnum
14 strnum
15 strnum
16 undefined
A notável fraqueza é: se você fornecer "string numérica" de qualquer um dos a seguir, a função retornará incorretamente "number":
- inteiro
-
inf
-
-inf
Para números inteiros, isso é explicado:
A numeric value that is exactly equal to the value of an integer shall be converted to a string by the equivalent of a call to the
sprintf
function with the string%d
as thefmt
argument
No entanto, inf
e -inf
também se comportam dessa maneira; isto é, que nenhum dos
o acima pode ser influenciado pela variável CONVFMT
:
CONVFMT = "% g"
print "" .1
print "" (+"nan")
print "" 1
print "" (+"inf")
print "" (+"-inf")
Resultado:
0.1
nan
1
inf
-inf
Na prática, isso não importa, veja o teste de
.