[second attempt at sending -- i had sent this earlier, but apparently it never made it out.]
Here's a quicky which handles arbitrary decimal fractions as rationals. It will have problems if you try it on numbers which include letters already in their representation. It may have other issues, since my testing is limited (and computers sometimes exhibit problems). dectorat=:{{ y=.y,' ' dots=. I. y e. '.' spac=. I. y e. ' ' fix=. spac{~ ~.(i.-.&0) dots I. spac r=. fix-dots+1 extra=. ({:fix)}.y 0 ". '.'-.~extra,~;r (,'r',&":10&^)~each (fix e.~i.#y) <;._2 y }} Example use: dectorat'123 456.79 9.123' 123 45679r100 9123r1000 FYI, -- Raul On Wed, Jan 6, 2021 at 5:05 AM Raul Miller <rauldmil...@gmail.com> wrote: > > The x: mechanism does first convert to floats, and then to rationals. > As long as your values are not too large, the result should be exact. > > I imagine that it would be nice if dyadic ". or a workalike could > support direct interpretation as rational numbers. > > FYI, > > -- > Raul > > > On Wed, Jan 6, 2021 at 4:48 AM Justin Paston-Cooper > <paston.coo...@gmail.com> wrote: > > > > Thanks. Seems to be working now, even with a parenthesis removed from > > each end. I wasn't getting a syntax error. Weird. > > > > I don't see what you mean by "doesn't give the number you suggest". I > > think I am missing something. 33333/50 is equal to 666.66. 333/50 is > > equal to 6.66. This is what I expected. > > > > As far as I understand, your solution parses strings to floats, and > > then converts to extended. Don says that the internal float > > representation is not an exact representation of the string. This > > would make sense. It may be the case that your examples correspond > > with the input numbers. I would imagine that for larger numbers there > > would be a discrepancy. > > > > ([: x: 0&".) '10000000000.12345' gives: > > > > 810000000010r81 > > > > This is close, but not equal to the input. > > > > stringToRational '10000000000.12345' gives: > > > > 200000000002469r20000 > > > > This is correct. > > > > My solution parses the digits exactly as if there were no dot and > > divides by 10^(number of digits after point). > > > > On Wed, 6 Jan 2021 at 12:20, Ric Sherlock <tikk...@gmail.com> wrote: > > > > > > Hi Justin, > > > I'm not entirely clear what your desired behaviour/use case is, however if > > > you add another closing parenthesis then your definition above does not > > > give a (syntax) error, but doesn't give the number you suggest. > > > > > > stringToRational =: ((_&".)@(-.&'.') %&:x: 10&^@(<:@# - (i.&'.'))) > > > > > > stringToRational '666.66' > > > > > > 33333r50 > > > > > > stringToRational '6.66' > > > > > > 333r50 > > > > > > > > > Assuming you just want to represent all strings as their equivalent > > > rationals, is there a reason not to define stringToRational like this? > > > > > > stringToRational =: [: x: 0&". > > > > > > stringToRational '666.66' > > > > > > 33333r50 > > > > > > stringToRational&> '66666';'6666.6';'666.66';'66.666';'6.6666';'0.66666' > > > > > > 66666 33333r5 33333r50 33333r500 33333r5000 33333r50000 > > > > > > > > > > > > On Wed, Jan 6, 2021 at 8:20 PM Justin Paston-Cooper > > > <paston.coo...@gmail.com> > > > wrote: > > > > > > > Thanks for the suggestion. I've combined Don's idea of using x: and > > > > your idea of removing the point and parsing that to handle all numbers > > > > of digits after the decimal point: > > > > > > > > stringToRational =: ((_&".)@(-.&'.') %&:x: 10&^@(<:@# - (i.&'.')) > > > > > > > > stringToRational '666.66' should give 333r50. > > > > > > > > Sadly this is giving a domain error, even though both sides of the > > > > fork work alone. Could anyone suggest how to fix this? > > > > > > > > On Tue, 5 Jan 2021 at 19:14, Jimmy Gauvin <jimmy.gau...@gmail.com> > > > > wrote: > > > > > > > > > > IF your strings always have two numbers after the decimal point you > > > > > could > > > > > remove the point before converting to numeric. > > > > > > > > > > NB.Remove decimal point > > > > > '.' -.~ each '123.45' ; '1456.12' > > > > > ┌─────┬──────┐ > > > > > │12345│145612│ > > > > > └─────┴──────┘ > > > > > > > > > > NB. Convert to numeric > > > > > _ ". > '.' -.~ each '123.45' ; '456.12' > > > > > 12345 45612 > > > > > > > > > > NB. type 4 is integer > > > > > 3!:0 ] _ ". > '.' -.~ each '123.45' ; '456.12' > > > > > 4 > > > > > > > > > > On Tue, Jan 5, 2021 at 10:43 AM Justin Paston-Cooper < > > > > > paston.coo...@gmail.com> wrote: > > > > > > > > > > > Hello, > > > > > > > > > > > > I am reading in tab-separated files with readdsv from 'tables/dsv'. > > > > > > Some columns consist of exact decimal numbers like 6.66. These > > > > generally > > > > > > involve amounts of a decimal currency. These are read in by readdsv > > > > > > as > > > > > > boxed strings. makenum from 'tables/csv' converts these strings to > > > > > > floats. I would like these strings to be converted exactly to > > > > > > rationals. How can I go about this in the easiest and most efficient > > > > > > way? I could not find information on parsing data types from > > > > > > strings. > > > > > > > > > > > > Thanks in advance, > > > > > > > > > > > > Justin > > > > > > ---------------------------------------------------------------------- > > > > > > For information about J forums see > > > > > > http://www.jsoftware.com/forums.htm > > > > > > > > > > > ---------------------------------------------------------------------- > > > > > For information about J forums see http://www.jsoftware.com/forums.htm > > > > ---------------------------------------------------------------------- > > > > For information about J forums see http://www.jsoftware.com/forums.htm > > > > > > > ---------------------------------------------------------------------- > > > For information about J forums see http://www.jsoftware.com/forums.htm > > ---------------------------------------------------------------------- > > For information about J forums see http://www.jsoftware.com/forums.htm ---------------------------------------------------------------------- For information about J forums see http://www.jsoftware.com/forums.htm