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

Reply via email to