Format Decimal

From Second Life Wiki
Revision as of 03:33, 9 September 2007 by Huney Jewell (talk | contribs) (Added description of 'FormatDecimal' function)
(diff) ← Older revision | Latest revision (diff) | Newer revision → (diff)
Jump to navigation Jump to search

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