Shop OBEX P1 Docs P2 Docs Learn Events
Enjoy! Fixed-width decimal printout, with decimals — Parallax Forums

Enjoy! Fixed-width decimal printout, with decimals

localrogerlocalroger Posts: 3,452
edited 2009-08-17 13:06 in Propeller 1
You might have noticed that most of the public output objects have nice fixed width binary and hex outputs but the decimal output is variable-width so you can't use it to create nice formatted displays.

*cough*

PUB fdec(value, len, dp) | p, fnumbuf[noparse][[/noparse] 4 ]
{ 
Print a formatted signed decimal number

The dec method provided with most output objects inexplicably
doesn't do fixed length.  This version also inserts an
optional decimal point.  A negative dp specifies dead zeroes,
e.g. dp=-3 returns 000 instead of 0.

Observe the sneakiness with which I allocate a temporary
string buffer... fnumbuf thinks it's 4 longs but I use
it as bytes so I can write the decimal out backward.
Note that you can't return a pointer to this string since
it's on the stack and goes away when we return; to do that
you must create a buffer outside of this routine and add
its location to the parameter list.

First we prep the buffer with any leading zero and
decimals that might be called for, then write the number
down backward skipping over the decimal and skipping
over any remaining zeroes for the minus sign.
}
  bytefill(@fnumbuf," ",14)
  byte[noparse][[/noparse]@fnumbuf+14] := 0
  
  p := @fnumbuf + 13
  if dp > 0
    repeat dp
      byte[noparse][[/noparse]p] := "0"
      p--
    byte[noparse][[/noparse]p] := "."
    p--
    byte[noparse][[/noparse]p] := "0"
    p--
  elseif dp < 0
    repeat -dp
      byte[noparse][[/noparse]p] := "0"
      p--
  else
    byte[noparse][[/noparse]p] := "0"
    p--
         
  rdec(value, @fnumbuf+13)
  str(@fnumbuf + 14 - len)  
      
PRI rdec(value, atloc) | s
{
  This is works like dec but writes the number to memory
  down from the starting atloc.  It will not write over
  a decimal point; the string should be pre-loaded with
  any necessary leading zeroes and decimals.  There are
  no controls so be sure the buffer is large enough to
  handle a signed, decimalled 9-digit number.
}
  s := 0
  if value < 0
    -value
    s := "-"
    
  repeat while value <> 0
    'skip over decimal
    if byte[noparse][[/noparse]atloc] == "."
      atloc --
    byte[noparse][[/noparse]atloc] := value // 10 + "0"
    atloc --
    value /= 10

  if s
    'skip over any non space before writing sign
    repeat while byte[noparse][[/noparse]atloc] <> " "
      atloc --
    byte[noparse][[/noparse]atloc] := s  




You can consider this public domain, as there isn't enough here to justify a copyright claim.

Post Edited (localroger) : 8/17/2009 4:55:05 PM GMT
Sign In or Register to comment.