It is often required to change the data type of some data from one type to another. The standard casting function is the “$” dyadic operator.
Three approaches are used to cast from one type to another (except for string) −
In the following example of casting integers to floats, all the three different ways of casting are equivalent −
q)a:9 18 27 q)$[`float;a] / Specify desired data type by its symbol name, 1st way 9 18 27f q)$["f";a] / Specify desired data type by its character, 2nd way 9 18 27f q)$[9h;a] / Specify desired data type by its short value, 3rd way 9 18 27f
Check if all the three operations are equivalent,
q)($[`float;a]~$["f";a]) and ($[`float;a] ~ $[9h;a]) 1b
Casting string to symbols and vice versa works a bit differently. Let’s check it with an example −
q)b: ("Hello";"World";"HelloWorld") / define a list of strings q)b "Hello" "World" "HelloWorld" q)c: `$b / this is how to cast strings to symbols q)c / Now c is a list of symbols `Hello`World`HelloWorld
Attempting to cast strings to symbols using the keyed words `symbol or 11h will fail with the type error −
q)b "Hello" "World" "HelloWorld" q)`symbol$b 'type q)11h$b 'type
Casting strings to a data type other than symbol is accomplished as follows −
q)b:900 / b contain single atomic integer q)c:string b / convert this integer atom to string “900” q)c "900" q)`int $ c / converting string to integer will return the / ASCII equivalent of the character “9”, “0” and / “0” to produce the list of integer 57, 48 and / 48. 57 48 48i q)6h $ c / Same as above 57 48 48i q)"i" $ c / Same a above 57 48 48i q)"I" $ c 900i
So to cast an entire string (the list of characters) to a single atom of data type x requires us to specify the upper case letter representing data type x as the first argument to the $ operator. If you specify the data type of x in any other way, it result in the cast being applied to each character of the string.