Login
`
Templates, Tools and Utilities
|
||
Add a comment to an Icetips ArticlePlease add your comments to this article.
Please note that you must provide both a name and a valid email address in order
for us to publish your comment. Comments are moderated and are not visible until they have been approved. Spam is never approved!
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, 6:29 am This article has been viewed 35219 times.
|
|