Difference between revisions of "Format Decimal"

From Second Life Wiki
Jump to navigation Jump to search
m (^^; oops)
Line 7: Line 7:
{{LSL DefineRow|[[float]]|number|any valid float, positive or negative}}
{{LSL DefineRow|[[float]]|number|any valid float, positive or negative}}
{{LSL DefineRow|[[integer]]|precision|precision of result. Positive values truncate fraction, negative values truncate integer part of '''number'''}}
{{LSL DefineRow|[[integer]]|precision|precision of result. Positive values truncate fraction, negative values truncate integer part of '''number'''}}
|}
<pre>
<pre>
string FormatDecimal (float number, integer precision)
string FormatDecimal (float number, integer precision)

Revision as of 15:58, 9 September 2007

Function: string FormatDecimal(float number, integer precision);

Formats a float value to a fixed precision ie. for display purposes

Returns a string that comprises the number truncated and rounded to the given precision.

• float number any valid float, positive or negative
• integer precision precision of result. Positive values truncate fraction, negative values truncate integer part of number
string FormatDecimal (float number, integer precision)
{    
    float roundingValue = llPow(10, -precision)*0.5;
    float rounded;
    if (number < 0) rounded = number - roundingValue;
    else            rounded = number + roundingValue;
    
    if (precision < 1) // Rounding integer value
    {
        integer intRounding = (integer)llPow(10, -precision);
        rounded = (integer)rounded/intRounding*intRounding;
        precision = -1; // Don't truncate integer value
    }
    
    string strNumber = (string)rounded;
    return llGetSubString(strNumber, 0, llSubStringIndex(strNumber, ".") + precision);
}

Examples:
FormatDecimal(123.456, 2); // Result: 123.46
FormatDecimal(-123.456, 2); // Result: -123.46
FormatDecimal(123.456, 0); // Result: 123
FormatDecimal(-123.456, -2); // Result: -100

Caveats

Maximum value is restricted to integer range, that is -2,147,483,648 to +2,147,483,647

Example

Trivial example to listen to any chat from the object owner for number,precision values and respond formatted value.

 string FormatDecimal (float number, integer precision)
 {    
     float roundingValue = llPow(10, -precision)*0.5;
     float rounded;
     if (number < 0) rounded = number - roundingValue;
     else            rounded = number + roundingValue;
     
     if (precision < 1) // Rounding integer value
     {
         integer intRounding = (integer)llPow(10, -precision);
         rounded = (integer)rounded/intRounding*intRounding;
         precision = -1; // Don't truncate integer value
     }
     
     string strNumber = (string)rounded;
     return llGetSubString(strNumber, 0, llSubStringIndex(strNumber, ".") + precision);
 }
 
 default
 {
     state_entry()
     {
         llOwnerSay("Enter: [number,precision]");
         llListen(0, "", llGetOwner(), "");
     }
 
     listen(integer _chan, string _str, key _id, string _msg)
     {
         list values=llCSV2List(_msg);
         float number = llList2Float(values,0);
         integer decimals = llList2Integer(values,1);
         llOwnerSay("Number " + (string)number + " is formatted " + FormatDecimal(number, decimals));
     }
 }