$ 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
ycast according tox1h "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`ssandyis a temporal type, returns the year, day, month, hour, minute, or seconds value fromyas tabulated below -
0hor"*", andyis not a string, returnsy(Identity) -
an upper-case letter or a negative short int interprets the value from a string, 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¶
The following symbols can be used to extract parts of a temporal type
yearto provide year as an integermonthto providemonthdatatypemmto provide month as an integer, where January is 01iweekto provide adatedatatype, presenting the week in which the temporal variable resides. The value returned is the start of the week (Monday). If thedaterepresents a Monday, it is not altered.ddto provide day as an integer, where 1st of the month is 1ihhto provide hour as an integeruuto provide minutes as an integerssto provide to seconds as an integer
For example:
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
The following shows which information can be extracted from each temporal datatype
| 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
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.
Numeric calculations on the base numeric type can also be used to extract part of a temporal type, for the example using the mod keyword
milliseconds: "i"$01:00:00.100 mod 1000 / extract milliseconds from time datatype
milliseconds: "i"$mod[;1000]"t"$2000.01.01T12:00:00.500 / extract milliseconds from datetime datatype
nanoseconds: "i"$2014.11.22D17:43:40.123456789 mod 1000000000 / extract nanoseconds from timestamp datatype
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