Difference between revisions of "Format Decimal"

From Second Life Wiki
Jump to navigation Jump to search
(Well fiddled, Strife. Now fiddling to the excess :-)) but how to center justify entries in table "Examples"?)
Line 32: Line 32:
<div style="padding: 0.5em;">
<div style="padding: 0.5em;">
<pre>
<pre>
string FormatDecimal (float number, integer precision)
string FormatDecimal(float number, integer precision)
{     
{     
     float roundingValue = llPow(10, -precision)*0.5;
     float roundingValue = llPow(10, -precision)*0.5;
Line 51: Line 51:
</pre>
</pre>
'''Examples:'''
'''Examples:'''
{| {{Prettytable}}
{| border="2" cellspacing="0" cellpadding="3" rules="all" style="margin:1em 1em 1em 0; border:solid 1px #AAAAAA; border-collapse:collapse; background-color:#F9F9F9; font-size:90%; empty-cells:show;"
 
|-{{Hl2}}
|-{{Hl2}}
!{{LSL Param|number}}
!{{LSL Param|number}}
!{{LSL Param|precision}}
!{{LSL Param|precision}}
!Result
!Result
!Source
|-
|-
|123.456
|123.456
|2
|2
|123.46
|123.46
|<code>FormatDecimal(123.456, 2)</code>
|-
|-
| -123.456
| -123.456
|2
|2
| -123.46
| -123.46
|<code>FormatDecimal(-123.456, 2)</code>
|-
|-
|123.456
|123.456
|0
|0
|123
|123
|<code>FormatDecimal(123.456, 0)</code>
|-
|-
|123.456
|123.456
| -2
| -2
|100
|100
|<code>FormatDecimal(123.456, -2)</code>
|}
|}
</div></div><div id="box">
</div></div><div id="box">
== Caveats ==
== Caveats ==
<div style="padding: 0.5em;">
<div style="padding: 0.5em;">

Revision as of 04:09, 10 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


precision Value
positive Truncates number rounded to this fraction positions
zero Truncates number rounded to it's integer value
negative Rounds number at this pre-decimal position

Specification

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:

number precision Result Source
123.456 2 123.46 FormatDecimal(123.456, 2)
-123.456 2 -123.46 FormatDecimal(-123.456, 2)
123.456 0 123 FormatDecimal(123.456, 0)
123.456 -2 100 FormatDecimal(123.456, -2)

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));
    }
}