` Decimal to fraction (Geoff Robinson ) - Icetips Article
Icetips - Templates, Tools & Utilities for Clarion Developers

Templates, Tools and Utilities
for Clarion Developers

Icetips Article

Back to article list   Search Articles     Add Comment     Printer friendly     Direct link  

Par2: Decimal to fraction
2011-05-05 -- Geoff Robinson
 
as others have stated to convert a fraction to a decimal just divide the numerator by the denominator. going the other way is trickier 8-) I wrote the following seven years ago (based on C code I had written back in June 1992) when the question came up in a newsgroup, and have tweaked it a bit today... it is based on Euclid's algorithm HTH Geoff R !-------------------------------------------------------------------------- VitCreateFraction FUNCTION (STRING p:Str) ! Written by Geoff Robinson, Vitesse Information Systems P/L, vitesse@mira.net ! Date: 4 May 2004 (tweaks to allow for negatives seven years later on 5&6 May 2011) ! - Assumes passed string holds valid number ! Feel free to use at own risk! L:Len LONG,AUTO i LONG,AUTO u LONG,AUTO v LONG,AUTO Numerator LONG Denominator LONG,AUTO WholeNumber STRING(32) DecPoint EQUATE('.') ! some countries may use a comma instead of dot L:Negative BYTE CODE p:Str = left(p:Str) L:Len = len(clip(p:Str)) if L:Len if p:Str[L:Len] = '-' ! allow for trailing negative L:Negative = TRUE p:Str[L:Len] = ' ' end if p:Str[1] = '-' ! allow for leading negative L:Negative = TRUE p:Str[1] = ' ' p:Str = left(p:Str) end if L:Negative then L:Len = len(clip(p:Str)). ! adjust length end if ~L:Len then return(''). ! blank string or only negative sign(s) passed over... i = instring(DecPoint,p:Str,1,1) !find the decimal point if ~i ! no decimal point found WholeNumber = p:Str else if i > 1 WholeNumber = p:Str[1 : i - 1] ! get whole number end if i < L:Len Numerator = p:Str[i + 1 : L:Len] ! get decimal fraction digits for the numerator end end if ~Numerator ! no decimal fraction to work with eg. '1.000' return(choose(~L:Negative,'','-') & clip(WholeNumber)) end Denominator = '1' & all('0',L:Len - i) ! get the initial denominator v = Numerator u = Denominator ! get the greatest common divisor based on Euclid's algorithm LOOP u = u % v if ~u then break. ! swap u and v i = u u = v v = i END!loop return( choose(~L:Negative,'','-') & | choose(WholeNumber <> 0,clip(WholeNumber) & ' ','') & | Numerator/v & '/' & Denominator/v )


Today is November 21, 2024, 3:51 am
This article has been viewed 35218 times.



Back to article list   Search Articles   Add Comment   Printer friendly

Login

User Name:

Password: