Difference between revisions of "Typecast"
Liny Odell (talk | contribs) |
Felis Darwin (talk | contribs) (→Notes) |
||
Line 164: | Line 164: | ||
== Notes == | == Notes == | ||
<div style="padding: 0.5em;"> | <div style="padding: 0.5em;"> | ||
*Typcasting from a float to an integer merely removes the portion of the number following the decimal point. To round to the nearest whole integer, use [[llRound]]. | |||
*For getting at the elements of a list use the {{LSLGC|List/Read Element|llList2*}} functions. | *For getting at the elements of a list use the {{LSLGC|List/Read Element|llList2*}} functions. | ||
</div></div> | </div></div> |
Revision as of 14:29, 16 March 2012
LSL Portal | Functions | Events | Types | Operators | Constants | Flow Control | Script Library | Categorized Library | Tutorials |
To convert the type of a value a typecast is required. There are two types of typecasting, explicit and implicit. Explicit typecasts must be provided by the programmer, but implicit typecasts are put in place by the compiler. LSL implicitly typecasts strings to keys and integers to floats where the latter type is required but the former is provided.
Supported Typecasts | ||||||||
---|---|---|---|---|---|---|---|---|
To | ||||||||
integer | float | string | key | list | vector | rotation | ||
From | integer | x | x | x | x | |||
float | x | x | x | x | ||||
string | x | x | x | x | x | x | x | |
key | x | x | x | |||||
list | x | x | ||||||
vector | x | x | x | |||||
rotation | x | x | x |
Syntax: (type)value
Converts value to type.
• expression | type | – | variable type | |
• expression | value | – | expression or constant |
If value is a complex expression, it may be beneficial to wrap it in parentheses. (type)(value)
Examples
<lsl> string a = "1.5"; float b = (float)a; integer c = (integer)a;
integer i; i = (integer) 1.23; // 1 i = (integer) -1.23; // -1 i = (integer) "0123"; // 123 i = (integer) "0x12A"; // 298 i = (integer) " -5 "; // -5; leading whitespace is ignored i = (integer) "105 degrees here, it is a nice day"; // 105; non-numeric text which follows numeric text is ignored i = (integer) "String with no numbers"; // 0
float f; f = (float) "6.2e1"; // 62.0 f = (float) " -16.2°C is seriously cold!"; // -16.2; (float)string also ignores leading whitespace and trailing non-numeric characters // "6.2e1", "6.2e+1", "6.2E1", "6.2E+1" are all equivalent. f = (float) "Nancy"; // any string beginning with "nan" (case insensitive) --
// Mono only: NaN (not a number); LSO: causes a math error
f = (float) "infallible LSL!"; // any string beginning with "inf" (case insensitive) --
// Mono only: Infinity; LSO: causes a math error
string s; s = (string) [1, 2.3, "a"]; // "12.300000a" s = (string) <1.0, 2.3, 4.56>; // "<1.00000, 2.30000, 4.56000>"
list l; l = (list) ""; // [""] l = (list) <1.0, 2.3, 4.56>; // ["<1.00000, 2.30000, 4.56000>"]
vector v; v = (vector) "<1.0, 2.3, 4.56>"; // <1.0, 2.3, 4.56> v = (vector) "<1.0, 2.3>"; // ZERO_VECTOR (Due to insufficient value)
rotation r; r = (rotation) "<1.0, 2.3, 4.56, 1.0>"; // <1.0, 2.3, 4.56, 1.0> r = (rotation) "<1.0, 2.3, 4.56>"; // ZERO_ROTATION (Due to insufficient value) </lsl>
Applied
<lsl>default {
state_entry() { integer iUnixTime = llGetUnixTime(); string sUnixTime = (string)unixTime; string sRegionTime = (string)llGetTimeOfDay(); llSetObjectDesc(sUnixTime); llSetText(sRegionTime, <1.0, 0.0 ,0.0>, 1.0); }
}</lsl>
Caveats
- The compiler allows explicit typecasting where it is not needed and does not optimize it out. Unnecessary typecasts will bloat code and slow it down.