$
Cast¶
Convert to another datatype
x$y $[x;y]
Where x
is:
-
a positive short, lower-case letter, or symbol from the following table, returns
y
cast according tox
1h "b" `boolean 2h "g" `guid 4h "x" `byte 5h "h" `short 6h "i" `int 7h "j" `long 8h "e" `real 9h "f" `float 10h "c" `char 12h "p" `timestamp 13h "m" `month 14h "d" `date 15h "z" `datetime 16h "n" `timespan 17h "u" `minute 18h "v" `second 19h "t" `time
-
a symbol from the list
`year`dd`mm`hh`uu`ss
andy
is a temporal type, returns the year, day, month, hour, minute, or seconds value fromy
as tabulated below -
0h
or"*"
, andy
is not a string, returnsy
(Identity) -
an upper-case letter or a negative short int, see Tok
Casting does not change the underlying bit pattern of the data, only how it is represented.
$
(cast) is a multithreaded primitive.
Iteration¶
Cast is an atomic function.
q)12 13 14 15 16 17 18 19h$42
2000.01.01D00:00:00.000000042
2003.07m
2000.02.12
2000.02.12T00:00:00.000
0D00:00:00.000000042
00:42
00:00:42
00:00:00.042
q)(12h;"m";`date)$42
2000.01.01D00:00:00.000000042
2003.07m
2000.02.12
q)(12h;"m";`date)$42 43 44
2000.01.01D00:00:00.000000042
2003.08m
2000.02.14
q)(12h;13 14h)$(42;42 42)
2000.01.01D00:00:00.000000042
(2003.07m;2000.02.12)
Integer¶
Cast to integer:
q)"i"$10
10i
q)(`int;"i";6h)$10
10 10 10i
q)`int$(neg\)6.1 6.6
6 7
-6 -7
Boolean¶
Cast to boolean:
q)1h$(neg\)1 0 2
101b
101b
Characters are cast to True.
q)" ",.Q.an
" abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ_0123456789"
q)"b"$" ",.Q.an
1111111111111111111111111111111111111111111111111111111111111111b
Byte¶
q)"x"$3 4 5
0x030405
q)"x"$"abc"
0x616263
Casting longs above int infinity
Longs greater than 0wi
cast to 0xff
q)"x"$-2 -1 0 1 2+0Wi
0xfdfeffffff
This is considered an error and is planned to change to 0x00
.
Temporal¶
Find parts of time:
q)`hh`uu`ss$03:55:58.11
3 55 58i
q)`year`dd`mm`hh`uu`ss$2015.10.28D03:55:58
2015 28 10 3 55 58i
| year | month | mm | week | dd | hh | uu | ss
--------------------------------------------------------
timestamp | x | x | x | x | x | x | x | x
month | x | x | x | | | | |
date | x | x | x | x | x | | |
datetime | x | x | x | x | x | x | x | x
timespan | | | | | | x | x | x
minute | | | | | | x | x | x
second | | | | | | x | x | x
time | | | | | | x | x | x
milliseconds: "i"$time mod 1000
milliseconds: "i"$mod[;1000]"t"$datetime
nanoseconds: "i"$timestamp mod 1000000000
Casting to narrower temporal type truncates rather than rounds
Such conversions use floor, because the day, hour, minute, second… are all [) notions. (What hour are we in; what millisecond are we in…)
For example, "d"$2017.08.23T23:50:12
is 2017.08.23
even though the datetime is closer to 2017.08.24
.
As a consequence .z.t-.z.n
is typically negative.
Identity¶
q)("*";0h)$1
1 1
For string values of y
, see Tok.
Infinities and beyond¶
Casting an infinity from a narrower to a wider datatype returns a finite value.
When an integral infinity is cast to an integer of wider type, it is the same underlying bit pattern, reinterpreted.
Since this bit pattern is a legitimate value for the wider type, the cast returns a finite value.
q)`float$0Wh
32767f
The infinity corresponding to numeric x
is min 0#x
.
Tok
Overloads of $
Q for Mortals
§7.2 Cast