Talk:Float2String
Please be kind to totally review your text and code; examples are false, code is insufficiently implemented.
Examples: string myFormattedFloat = Float2String(-7.1373699,3,"Round"); //rounded returns -7.14
string myFormattedFloat = Float2String(-7.1373699,3,""); //not rounded returns -7.13
The real result is -7.137 for the both
Code:
if (places == 0)
{
return neg + (string) ((integer)num );
}
This is true if you want to truncate it, but false if you want to round it.
Other: To round it's written : "should be set to "Rounded" for Yes" in the expanations, //rnd (rounding) should be set to "Rounded" for Yes, "" for not rounded in a Comment Line and Yes in the code. Note that the wiki is first for people who want to study LSL.
Garmin Kawaguichi
Errors with posted code
- Code gives syntax error when copying/pasting code. (superfluous "else"?)
- Float2String(-123.456,0,FALSE) yields "--123". Should be "-123".
- Float2String(-123.456,0,TRUE) yields "-123.00000123". Should be "-123"
--Rhian Svenska 16:11, 8 October 2008 (PDT)
More code than needed?
Forgive me if I'm wrong, but it looks to me as if the "00000" prefix for s and the call to llFabs(), and subsequent if (neg < 0.0) are extraneous? In all my tests it seems the code functions just fine without any of them, am I missing something?
Like-so: <lsl>string Float2String ( float num, integer places, integer rnd) { //allows string output of a float in a tidy text format //rnd (rounding) should be set to TRUE for rounding, FALSE for no rounding
if (rnd) {
float f = llPow( 10.0, places );
integer i = llRound(num * f); // Removed llFabs() due to later change
return (string)( (integer)(i / f) ) + "." + llGetSubString( (string)i, -places, -1); // Removed if (num < 0.0) as (string)((integer)i / f)) provides negative just fine
}
if (!places)
return (string)((integer)num );
if ( (places = (places - 7 - (places < 1) ) ) & 0x80000000)
return llGetSubString((string)num, 0, places);
return (string)num;
}</lsl>
-- Haravikk (talk|contribs) 22:01, 18 October 2010 (UTC)
- I should probably note also that the following is a tiny bit more efficient (less returns, which are fairly byte code heavy):
<lsl>string Float2String ( float num, integer places, integer rnd) { //allows string output of a float in a tidy text format //rnd (rounding) should be set to TRUE for rounding, FALSE for no rounding
string str = "";
if (rnd) {
float f = llPow( 10.0, places );
integer i = llRound(num * f); // Removed llFabs() due to later change
str = (string)( (integer)(i / f) ) + "." + llGetSubString( (string)i, -places, -1); // Removed if (num < 0.0) as (string)((integer)i / f)) provides negative just fine
} else if (!places) {
str = (string)((integer)num );
} else if if ( (places = (places - 7 - (places < 1) ) ) & 0x80000000) {
str = llGetSubString((string)num, 0, places);
} else {
str = (string)num;
}
return str;
}</lsl>