Re: Customizing output format
- To: mathgroup at smc.vnet.net
- Subject: [mg9637] Re: Customizing output format
- From: daiyanh at mindspring.com (Daitaro Hagihara)
- Date: Mon, 17 Nov 1997 19:49:45 -0500
- Organization: MindSpring Enterprises
- Sender: owner-wri-mathgroup at wolfram.com
In article <63rteg$llc at smc.vnet.net>, John Kiehl <jkiehl at interport.net> wrote: > I would like to create a function that takes 2 integers as input and > displays their product in the style of a grade school student. For > example: f[123,456] would output: > > 123 > 456 > ___ > 738 > 615 > 492 > ________ > 56088 > > Of course I want the lines as well as the numbers and I would like > things flush right in the cell. Thanks in advance. This is just a start. Format[multiply[a_Integer,b_Integer]:= Block[{dlist=Reverse[a IntegerDigits[b]], sep=StringJoin[Table["-",{Length[IntegerDigits[a b]]}]]}, Do[dlist[[i]]=If[dlist[[i]]==0,Null, StringJoin[ToString[dlist[[i]]],Table[" ",{i-1}]]], {i,Length[dlist]}]; ColumnForm[Cases[Flatten[{a,b,sep,dlist,sep,a b}],x_/;x=!=Null],Right]]] Mathematica[17]? multiply[123,456] 123 456 ----- 738 615 492 ----- 56088 Also, with the following def's: myPre[x_]:=(Hold[x]/.Literal[a_Integer X b_Integer]->multiply[a,b])[[1]]; SetAttributes[myPre,HoldFirst]; $Pre=myPre; you can do something like this: Mathematica[30]? 123 X 456 123 456 ----- 738 615 492 ----- 56088 In a production system, the method of arithmetic (multiplication in this case, or 'x') should be indicated in the display. The preprocessing parser should be restricted in its scope so that overall speed hit is kept at minimum, not to mention avoiding any side-effects. Special case handling such as multiplication by a single digit integer should also be taken care of. Finally, for better handling of chained multiplications, as well as making In's and Out's to work correctly, a more complex data structure is probably necessary.