[go: nahoru, domu]

Skip to content

$ 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 to x

    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 and y is a temporal type, returns the year, day, month, hour, minute, or seconds value from y as tabulated below

  • 0h or "*", and y is not a string, returns y (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