Dec2Binary ( dec ) voor FM18

Deze functie zet een decimaal getal ook om naar eenbinaire reeks, maar deze werkt met de vanaf FM18 beschikbare while-functie:

While (
[
n = Int ( dec ) ; // Dit is de invoer
p = If ( n > 0 ; Int ( Ln ( n ) / Ln ( 2 ) ) ) ; // Maximale macht van 2 bepalen
b = If ( n > 0 ; “” ; “0” ) // Lege variabele + pleistertje om met 0 om te kunnen gaan
] ;
p ≥ 0 ;
[
f = 2^p ; // Macht van 2 ter controle
p = p – 1 ; // Aftellen iteratie
x = Case ( n = 0 ; 0 ; n ≥ f ; 1 ; 0 ) ; // Bepalen van 1 of 0
n = n – f * x ; // Rest bepalen
b = b & GetAsText ( x ) // Digit toevoegen aan tot hier gevonden reeks
] ;
b // Resultaat tonen
)

Het bijzondere van deze functie is dat het resultaat altijd werkelijk tekst is en dat je dus geen rekening hoeft te houden met FileMaker die ineens wtenschappelijke notatie gaat toepassen. Je kan met deze functie integers met een lengte van circa 400 cijfers omzetten. De lengte van het resultaat wordt dan wel meer dan 1300 enen en nullen.

De werking van deze functie is ook anders dan die van Dec2Bin.

Bij Dec2Bin wordt iedere iteratie de maximale macht van 2 bepaald en daarmee wordt de waarde van een macht van 10 berekend, waarna deze waarde bij de uitkomst van de vorige iteratie woirdt geteld.

In deze Dec2Binary wordt eerst de maximum binary digit berekend, waarna van ieder minder significant bit de waarde (0 of 1) wordt bepaald. Deze functie is daarom enigszins trager dan Dec2Bin, maar heeft als voordeel dat je geen zorgen hebt over de weergave.

Dec2bom

Deze functie maakt gebruik van de Custom Functie Dec2bin om een “onzichtbare” index aan te maken tbv het sorteren van een keuzelijst:

Let ( [
num = dec ;
m = If ( len < 54 ; len ; 54 ) ; // Maximaal 54 bits = 18014398509481983
s = “0000000000000000000000000000000000000000000000000000000” ;
x = Mod ( num ; 2 ) ;
y = GetAsText ( If ( num < 2^m ; Right ( s & dec2bin ( num ) + not ( x ) ; m ) ; 2^m – 1 ) )
] ;
Substitute ( Left ( y ; Length ( y ) – 1 ) & x ; [ 0 ; Char ( 8203 ) ] ; [ 1 ; Char ( 65279 ) ] )
)

In werkelijkheid wordt hiermee een decimaal getal omgezet naar 1-en en 0-en, die op hun beurt weer worden omgezet naar de onzichtbare karakters Char ( 8203 ) en Char ( 65279 ). Wanneer je de string die hiermee wpordt gemaakt vóór een waarde zet, dan kan je op deze string sorteren terwijl je hem niet kan zien. Later volgt nog een artikel aan de Tips-zijde dat gaat over gesorteerde keuzelijsten.

Dec2bin

Deze functie zet een decimaal getal om naar een binaire reeks:

// Simpele functie om een decimaal getal om te zetten naar een binaire getal
//
// Let op met even getallen > 255 Deze functie maakt een binair getal uit machten
// van 10 en zodra je > 10^8 komt gaat FM over op wetenschappelijke notatie
// Dit kan je voorkomen door te zorgen dat het getal altijd oneven is. Na de
// omrekening zet je getal om naar tekst en je vervang indien je het zelf oneven
// hebt gemaakt, de laatste 1 weer voor een 0. Dit gaat goed tot 2^54 – 1
//
Let ( [
n = Int ( dec ) ;
p = Int( Ln ( n ) / Ln ( 2 ) )
] ;
Case ( n > 0 ; 10^p + dec2bin ( n – 2^p ) )
)

In het artikel over recursie hier op FileMakerTips staat de werking van deze functie (en de totstandkoming) precies beschreven

Round2Multiple

Dit is een heel eenvoudige functie, waarmee een getal op een veelvoud van een andere getal/fractie kan worden afgerond:

Round ( Number / Precision ; 0 ) * Precision

Ipv een nummer kan je ook een tijd gebruiken, de precision zijn dan de seconden. Afronden op hele minuten zou dan met precision 60 moeten.