ul$() functie

Geef hier je beste Liberty BASIC tips door. (Hier geen hulp vragen)

Moderators: anthonio, Abcott

ul$() functie

Berichtdoor glpape » zo apr 03, 2011 5:47 pm

ul$(), U voor Using, L voor Lazy.
De listing is een vol scherm - en wat krijg je daarvoor?
Het is een short-cut naar using(), en, meteen al sympathiek vind ik, met een $-teken in de functienaam die aangeeft dat de functie een string terug geeft; using() zelf produceert natuurlijk evenmin numerieke output maar etaleert dat niet openlijk.
Meer substantieel:
= minder en simpeler typewerk;
= makkelijk gebruik van variabelen in de functie; zoals in de volgende demo waar het aantal posities voor de decimale punt wordt bepaald door de lengte van het langste getal van 3 random numbers;
= een extra formattering optie.

Code: Selecteer alles
mainwin 70 30
comment$ = "  ( in tweede blok is 1e argument van ul$() functie negatief )"
print : print : print : print : print comment$: print : print

for n = 1 to 3                 '  3 random getallen [price(n)] van max 8 cijfers
cmax = int(rnd(0)*8)+1
  for m = 1 to cmax
  price$(n) = price$(n) + str$(int(rnd(0)*9))
  if m = 1 then price$(n) = str$(int(rnd(0)*8)+1)    ' 1e getal niet 0
  price(n) = val(price$(n))
  next m
if cmax > Euromax then Euromax = cmax                ' Euromax = cijfers voor de komma
next n

for n = 1 to 3
print , "Totaal ("; n; ") :  Euro "; ul$(Euromax, 2, price(n))
next n

print : print : print
for n = 1 to 3
print , "Totaal ("; n; ") :  Euro "; ul$(0-Euromax, 2, price(n))
next n

end

FUNCTION ul$(apn, b, num) 'v3.0   ' positions before the dot; behind it; number to display
                                  ' inserts comma's in integer part if apn is Negative
a = abs(apn)                                 ' apn: aposneg
ntc$ = "At least One Integer Position Required"; space$(5); chr$(10); chr$(10);_
       "You can print  < 0.25 >,  not  < .25 >"
if a = 0 then notice ntc$ : exit function
  for n = 1 to a
  a$ = a$; chr$(35)
  next n
    if b<>0 then
      for n = 1 to b
      b$ = b$; chr$(35)
      next n
    end if
if (b=0) then dot$ = "" else dot$ = "."
ul$ = using(a$;dot$;b$, num)
if (apn>0) goto [end]
  if (b=0) then                              ' Starting Comma Functionality
  ulc$ = ul$
  else
  ulc$ = left$(ul$, instr(ul$,".")-1)        ' ulc$: string lt of dot, incl leading spaces
  end if
if a < len(ulc$) then a = len(ulc$)
j=int( (a-1)/3 )                             ' total comma's or spaces
i = (a mod 3)  : if i=0 then i=3             ' positions before first comma
if (left$(ulc$,1) = "%") and (i = 1) then i = 4 : j = j-1    ' no comma after % only
  if a>3 then
    for n = 1 to j
    if (len(str$(int(num))) < len(mid$(ulc$,i))) then sp$ = " " else sp$ = ","
    ulc$ = left$(ulc$,i); sp$ ;  mid$(ulc$,i+1)            ' sp$ = separator: komma/spatie
    i = i + 4                     ' separator + 3 cijfers li v volgende komma
    next n
  end if
ul$ = ulc$; dot$; right$(ul$, b)
[end]
END FUNCTION



Ik merk nog op :
= als je aantal integer posities opgeeft als negatief getal krijg je komma's;
= let op: als je invoert bv < ul( -7, 0, getal ) > wordt het aantal posities voor de punt 9, 7 cijfers en 2 komma's;
= bij een kort getal krijg je spaties ipv komma's waar geen cijfers zijn maar altijd dezelfde 9 posities anders lijnt een kolom met lange en korte getallen niet goed op;
= als een getal te lang is krijg je het bekende "%". Een enkele "%" krijgt geen komma, dus %1000 wordt %1,000, maar %999 blijft onveranderd;
= Liberty leest .25 correct maar print het niet, dus < ul$(0, 2, .250) > genereert een Notice;
= als je komma's wilt en je gebruikt een variabele kun je daar niet zo maar een minteken voorzetten, de truc met de minste toetsaanslagen is aftrekken van 0, dus < ul$(0-var, 2, getal) > ;
= ik heb het Ëngelse systeem van Liberty aangehouden met een decimale punt en komma's voor de duizendtallen.

De code is aardig ingewikkeld, denk ik, str$(), instr(), midstr$(), bijna alle string functies komen langs. Voor wie de punt en de komma wil omzetten of op andere manier wil sleutelen aan de code, dit ;
= het eerste deel (tot "Comma Functionality") bouwt gewoon de using() template$ string op, chr$(35) is een hekje;
= het tweede deel pakt de string voor de decimale punt (als ulc$, Using Lazy Comma) en formatteert deze met komma's;
< i > is steeds het aantal posities links van de volgende komma;
< j > is het totaal aantal komma's of spaties;
er staat nog kort wat uitleg in de code.

En IfBugs, laat me weten.

Vr groet,

George Pape.
glpape
 
Berichten: 83
Geregistreerd: za nov 08, 2008 5:32 pm

Keer terug naar Tips en informatie

Wie is er online

Gebruikers op dit forum: Geen geregistreerde gebruikers. en 1 gast

cron