View unanswered posts | View active topics It is currently Thu Aug 17, 2017 2:57 am



Reply to topic  [ 4 posts ] 
 A helpful subroutine to format all numbers 
Author Message
Chief Warrant Officer
User avatar

Joined: Sat Feb 27, 2016 1:01 am
Posts: 145
Location: Molon Labe
Unread post A helpful subroutine to format all numbers
This AIO subroutine processes integers, decimals, and abbreviated sums (e.g., 10T, 125M, 1,000B) and formats them with commas. It handles any length integer or decimal. Please post/note any code improvements. TIA.


* See below revision 1.01.


Code:
:COMMAFY
#  Subroutine -- COMMAFY function for boundless sums, including decimals and game abbreviated sums.  Use placeholder:  $_COMMAFY
stripText $_COMMAFY ","
stripText $_COMMAFY " "
isNumber $ck_sum $_COMMAFY
if ($ck_sum <> 1)
  getWordPos $_COMMAFY $ck_T "T"
  getWordPos $_COMMAFY $ck_M "M"
  getWordPos $_COMMAFY $ck_B "B"
  if ($ck_T > 0)
   striptext $_COMMAFY "T"
   setVar $_COMMAFY ($_COMMAFY*1000)
  elseif ($ck_M > 0)
   striptext $_COMMAFY "M"
   setVar $_COMMAFY ($_COMMAFY*1000000)
  elseif ($ck_B > 0)
   striptext $_COMMAFY "B"
   setVar $_COMMAFY ($_COMMAFY*1000000000)
  else
#  The string does not hold a valid number set.
   echo #27 "[1;31m***  ¯  Error: '" $_COMMAFY "' is NaN!  Exiting Commafy Subroutine...**" #27 "[0m"
   return
  end
end
getLength $_COMMAFY $sum_length
#  Processing for handling decimals.
setVar $deci_holder ""
getWordPos $_COMMAFY $deci "."
if ($deci > 0)
  setVar $cut_deci $sum_length-$deci
  cutText $_COMMAFY $deci_holder $deci ($cut_deci+1)
  cutText $_COMMAFY $_COMMAFY 1 ($deci-1)
  getLength $_COMMAFY $sum_length
end
if ($sum_length > 3)
  setVar $commafy ""
  setVar $loops ($sum_length/3)
  setVar $front ($sum_length-$loops*3)
  setVar $left ($sum_length-2)
  while ($loops > 0)
   cutText $_COMMAFY $pos $left 3
   setVar $comma ""
   if ($loops > 1)
    setVar $comma ","
   end
   mergeText $comma & $pos $commafy $commafy
   subtract $left 3
   subtract $loops 1
  end
#  Include the remaininng front porition of the sum and if applicable the decimal portion.
  setVar $pos ""
  if ($front > 0)
   cutText $_COMMAFY $pos 1 $front
   setVar $pos $pos & ","
  end
  mergeText $pos $commafy & $deci_holder $_COMMAFY
else
  mergeText $_COMMAFY $deci_holder $_COMMAFY
end
return

#  END COMMAFY

_________________
The object of life is not to be on the side of the majority, but to escape finding one’s self in the ranks of the insane.” — Marcus Aurelius


Last edited by Adept on Tue Jun 14, 2016 11:39 am, edited 3 times in total.



Mon Apr 11, 2016 7:43 pm
Profile ICQ
Chief Warrant Officer
User avatar

Joined: Sat Feb 27, 2016 1:01 am
Posts: 145
Location: Molon Labe
Unread post Re: A helpful subroutine to format all number formats
...And here is a competing subroutine, which abbreviates integers, e.g., 1K, 2.5M, 256B, 850.6T.

Code:
:SUMMIFY
#  Subroutine -- Converts integers into abbreviated sums, rounding to 1 tenths.  Use placeholder:  $_SUMMIFY
stripText $_SUMMIFY ","
stripText $_SUMMIFY " "
isNumber $ck_sum $_SUMMIFY
if ($ck_sum = 1)
  getLength $_SUMMIFY $sum_length
  setPrecision 3
  if ($sum_length < 4)
#  Do nothing...
  elseif ($sum_length > 3) AND ($sum_length < 7)
#  1,000  - 999,999 -- K/Thous.
   setVar $_SUMMIFY ($_SUMMIFY/1000)
   round $_SUMMIFY 1
   mergeText $_SUMMIFY "K" $_SUMMIFY
  elseif ($sum_length > 6) AND ($sum_length < 10)
#  1,000,000 - 999,999,999 -- M/Mill.
   setVar $_SUMMIFY ($_SUMMIFY/1000000)
   round $_SUMMIFY 1
   mergeText $_SUMMIFY "M" $_SUMMIFY
  elseif ($sum_length > 9) AND ($sum_length < 13)
#  1,000,000,000 - 999,999,999,999 -- B/Bill.
   setVar $_SUMMIFY ($_SUMMIFY/1000000000)
   round $_SUMMIFY 1
   mergeText $_SUMMIFY "B" $_SUMMIFY
  elseif ($sum_length > 12) AND ($sum_length < 16)
#  1,000,000,000,000 - 999,999,999,999,999 -- T/Trill.
   setVar $_SUMMIFY ($_SUMMIFY/1000000000000)
   round $_SUMMIFY 1
   mergeText $_SUMMIFY "T" $_SUMMIFY
  else
#  The string is out of bounds.
   echo #27 "[1;31m***  ¯  Error: '" $_SUMMIFY "' is out of bounds!  Exiting Summify Subroutine...**" #27 "[0m"
   setPrecision 0
   return
  end
  setPrecision 0
  stripText $_SUMMIFY ".0"
  getLength $_SUMMIFY $sum_length
else
#  The string does not hold a valid number set.
  echo #27 "[1;31m***  ¯  Error: '" $_SUMMIFY "' is NaN!  Exiting Summify Subroutine...**" #27 "[0m"
  return
end

#  END SUMMIFY

_________________
The object of life is not to be on the side of the majority, but to escape finding one’s self in the ranks of the insane.” — Marcus Aurelius


Tue Apr 12, 2016 11:32 am
Profile ICQ
Chief Warrant Officer
User avatar

Joined: Sat Feb 27, 2016 1:01 am
Posts: 145
Location: Molon Labe
Unread post Re: A helpful subroutine to format all numbers
Now this is rather funny, I just came across the format command, which can provide commas to numbers (among other functions), so adding commas can be accomplished much more simply by using:

* NOTE: This will not work when compiled into a .cts file.

Code:
format $the_sum $_COMMAFY NUMBER
#  The following would depend if you wanted to maintain decimal accuracy or not, though you would need to know the decimals if not .00 and once the commas are added it is no longer treated numerically by TWX:
stripText $_COMMAFY ".00"


Easy peasy!

_________________
The object of life is not to be on the side of the majority, but to escape finding one’s self in the ranks of the insane.” — Marcus Aurelius


Last edited by Adept on Sat Oct 01, 2016 7:27 am, edited 1 time in total.



Wed May 04, 2016 9:49 am
Profile ICQ
Chief Warrant Officer
User avatar

Joined: Sat Feb 27, 2016 1:01 am
Posts: 145
Location: Molon Labe
Unread post Re: A helpful subroutine to format all numbers
Here is a small revision taking into account negative numbers, which was overlooked before (all seems to be working well after a bit of testing):

Code:
:COMMAFY
#  Subroutine -- COMMAFY function for boundless sums, including decimals and game abbreviated sums.  Use placeholder:  $_COMMAFY
stripText $_COMMAFY ","
stripText $_COMMAFY " "
getWordPos $_COMMAFY $neg "-"
if ($neg > 0)
setVar $neg 1
stripText $_COMMAFY "-"
end
isNumber $ck_sum $_COMMAFY
if ($ck_sum <> 1)
  getWordPos $_COMMAFY $ck_T "T"
  getWordPos $_COMMAFY $ck_M "M"
  getWordPos $_COMMAFY $ck_B "B"
  if ($ck_T > 0)
   striptext $_COMMAFY "T"
   setVar $_COMMAFY ($_COMMAFY*1000)
  elseif ($ck_M > 0)
   striptext $_COMMAFY "M"
   setVar $_COMMAFY ($_COMMAFY*1000000)
  elseif ($ck_B > 0)
   striptext $_COMMAFY "B"
   setVar $_COMMAFY ($_COMMAFY*1000000000)
  else
#  The string does not hold a valid number set.
   echo #27 "[1;31m**  ¯  Error: '" $_COMMAFY "' is NaN!  Exiting Commafy Subroutine...**" #27 "[0m"
   return
  end
end
getLength $_COMMAFY $sum_length
#  Processing decimals.
setVar $deci_holder ""
getWordPos $_COMMAFY $deci "."
if ($deci > 0)
  setVar $cut_deci $sum_length-$deci
  cutText $_COMMAFY $deci_holder $deci ($cut_deci+1)
  cutText $_COMMAFY $_COMMAFY 1 ($deci-1)
  getLength $_COMMAFY $sum_length
end
setVar $pos ""
if ($sum_length > 3)
  setVar $commafy ""
  setVar $loops ($sum_length/3)
  setVar $front ($sum_length-$loops*3)
  setVar $left ($sum_length-2)
  while ($loops > 0)
   cutText $_COMMAFY $pos $left 3
   setVar $comma ""
   if ($loops > 1)
    setVar $comma ","
   end
   mergeText $comma & $pos $commafy $commafy
   subtract $left 3
   subtract $loops 1
  end
#  Include the remaininng front porition of the sum and if applicable the decimal portion.
  setVar $pos ""
  if ($front > 0)
   cutText $_COMMAFY $pos 1 $front
   setVar $pos $pos & ","
  end
  if ($neg = 1)
   setVar $pos "-" & $pos
  end
  mergeText $pos $commafy & $deci_holder $_COMMAFY
else
  if ($neg = 1)
   setVar $pos "-"
  end
   mergeText $pos $_COMMAFY & $deci_holder $_COMMAFY
end
return

#  END COMMAFY

_________________
The object of life is not to be on the side of the majority, but to escape finding one’s self in the ranks of the insane.” — Marcus Aurelius


Tue Jun 14, 2016 11:40 am
Profile ICQ
Display posts from previous:  Sort by  
Reply to topic   [ 4 posts ] 

Who is online

Users browsing this forum: No registered users and 2 guests


You cannot post new topics in this forum
You cannot reply to topics in this forum
You cannot edit your posts in this forum
You cannot delete your posts in this forum
You cannot post attachments in this forum

Search for:
Jump to:  
Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group.
Designed by STSoftware.