Re: "FortranForm" for numbers?

*To*: mathgroup at smc.vnet.net*Subject*: [mg4640] Re: "FortranForm" for numbers?*From*: rubin at msu.edu (Paul A. Rubin)*Date*: Thu, 22 Aug 1996 03:54:57 -0400*Organization*: Michigan State University*Sender*: owner-wri-mathgroup at wolfram.com

In article <4u9ihd$moj at dragonfly.wolfram.com>, siegman at ee.stanford.edu (AES) wrote: -> ->Wanted: -> ->1) A simple way to put an option at the start of a notebook so that all ->output numbers (in Print, Write, TableForm, etc) will come out in ->something similar to Fortran format, e.g. -> -> 4.56789E-7 -> ->(I don't care much about the exact number of digits, or exactly where the ->decimal point ends up, and the exponent part can be skipped if not ->needed. Note that in mma FortranForm[1/7] comes out as 1/7 and not ->0.1429). I was with you until you said "simple." :-) Try defining the following functions: Clear[ oForm, fForm ] fForm[ x_ ] := StringJoin[ RealDigits[ x ] /. {a_List, b_} :> ToString /@ Flatten[ {First[ a ], ".", Rest[ a ], "E", b - 1} ] ] oForm[ x_Integer ] := fForm[ N[ x, Length[ IntegerDigits[ x ] ] ] ] oForm[ x_Rational ] := fForm[ N[ x ] ] oForm[ x_?NumberQ ] := fForm[ x ] oForm[ x_ ] := x SetAttributes[ oForm, Listable ] The function oForm will convert integer, rational and real quantities to Fortran-like notation, giving integers their full complement of significant digits (no loss of accuracy), converting rationals to machine numbers with default precision, and leaving the precision of other reals alone. It should leave anything else unmolested. If you don't want to convert integers, change the first part of the oForm definition to oForm[ x_Integer ] := x. Now, somewhere at the top of your notebook (after defining fForm and oForm), add the line $PrePrint = oForm; which will cause all output to be passed through oForm ... .. except output in a Print statement or in any kind of wrapper (such as TableForm). You could extend the definition of oForm to have it commute with each individual wrapper (e.g. TableForm), but it might be less hassle just to type it in, as in Print[ oForm[ Range[ 3 ] ] ] or TableForm[ oForm[ Range[ 3 ] ] ]. -> ->2) I'd also like to understand why TableForm sometimes comes out with ->blank lines between each line of output and sometimes not, on the same ->table (and it's not due to word wrapping). Just to annoy me - you're what the military would call "collateral damage." :-) Then again, it might be a rounding error in computing the number of elapsed lines or somesuch. -> And how to put multiple ->"sometable // TableForm ;" statements inside a Do loop and have them ->Print. -> Do[ ...; Print[ TableForm[ sometable ] ]; Print[ TableForm[ someothertable ] ]; ..., {iterator} ] should work. Paul ************************************************************************** * Paul A. Rubin Phone: (517) 432-3509 * * Department of Management Fax: (517) 432-1111 * * Eli Broad Graduate School of Management Net: RUBIN at MSU.EDU * * Michigan State University * * East Lansing, MI 48824-1122 (USA) * ************************************************************************** Mathematicians are like Frenchmen: whenever you say something to them, they translate it into their own language, and at once it is something entirely different. J. W. v. GOETHE ==== [MESSAGE SEPARATOR] ====