Metapost label - Truncating digits after decimal point
Hi, Is it possible to truncate the digits after decimal point in Metapost when using textext()? Please see the minimal example below which produces 1.84375. Can I just keep the first digit and have it produce 1.8 ? Thanks. \setuppapersize[letter][letter] \setupcolors[state=start] \starttext \startuseMPgraphic{Figure} u := 1cm; pickup pencircle scaled 2pt; % default pen thickness %TheFunction vardef f(expr x) = (10/x)-x*((0.5)**x) enddef; %Labels label.lft(textext(decimal f(5)),(0,f(5)) scaled u); \stopuseMPgraphic \useMPgraphic{Figure} \stoptext
Curiouslearn wrote:
Hi,
Is it possible to truncate the digits after decimal point in Metapost when using textext()? Please see the minimal example below which produces 1.84375. Can I just keep the first digit and have it produce 1.8 ?
Here is a helper macro for you: def trunc_digits(expr n, origs) = hide( string s, tmp; numeric ii, e; e := -1; for i=1 upto length(origs): ii := i; tmp := substring (i-1,i) of origs; if tmp = ".": if n=0: ii:=ii-1; exitif true; fi e:=0; fi if e>=0: e := e+1; exitif e>n; fi endfor; s:=substring(0,ii) of origs; ) s enddef; When run this macro with the result of decimal() as second argument, it will create a new string as many fractional digits as you specify in the first argument: label.lft(textext(trunc_digits(1,decimal f(5))),(0,f(5)) scaled u); Best wishes, Taco
Thanks so much, Taco. I will try out the code below. Good to know that
Metapost has functions such as substring.
On Sun, Nov 29, 2009 at 3:32 AM, Taco Hoekwater
Curiouslearn wrote:
Hi,
Is it possible to truncate the digits after decimal point in Metapost when using textext()? Please see the minimal example below which produces 1.84375. Can I just keep the first digit and have it produce 1.8 ?
Here is a helper macro for you:
def trunc_digits(expr n, origs) = hide( string s, tmp; numeric ii, e; e := -1; for i=1 upto length(origs): ii := i; tmp := substring (i-1,i) of origs; if tmp = ".": if n=0: ii:=ii-1; exitif true; fi e:=0; fi if e>=0: e := e+1; exitif e>n; fi endfor; s:=substring(0,ii) of origs; ) s enddef;
When run this macro with the result of decimal() as second argument, it will create a new string as many fractional digits as you specify in the first argument:
label.lft(textext(trunc_digits(1,decimal f(5))),(0,f(5)) scaled u);
Best wishes, Taco ___________________________________________________________________________________ If your question is of interest to others as well, please add an entry to the Wiki!
maillist : ntg-context@ntg.nl / http://www.ntg.nl/mailman/listinfo/ntg-context webpage : http://www.pragma-ade.nl / http://tex.aanhet.net archive : http://foundry.supelec.fr/projects/contextrev/ wiki : http://contextgarden.net ___________________________________________________________________________________
On Sat, 28 Nov 2009, Curiouslearn wrote:
Hi,
Is it possible to truncate the digits after decimal point in Metapost when using textext()? Please see the minimal example below which produces 1.84375. Can I just keep the first digit and have it produce 1.8 ?
Thanks.
If you are using mkiv, you can use lua to truncate a number. \unexpanded\def\truncate#1{\ctxlua{context("\%.1f", #1)}} \startMPdefinitions def truncatedtext(expr s) = textext("\truncate{" & s & "}") enddef ; \stopMPdefinitions \starttext \startuseMPgraphic{Figure} u := 1cm; pickup pencircle scaled 2pt; % default pen thickness %TheFunction vardef f(expr x) = (10/x)-x*((0.5)**x) enddef; %Labels %label.lft(textext("\truncate{" & decimal f(5) & "}"),(0,f(5)) scaled u); label.lft(truncatedtext(decimal f(5)),(0,f(5)) scaled u); \stopuseMPgraphic \useMPgraphic{Figure} \stoptext Aditya
Thanks for this solution. Sounds small and clean. I need to learn Lua I guess.
On Tue, Dec 15, 2009 at 5:34 AM, Aditya Mahajan
On Sat, 28 Nov 2009, Curiouslearn wrote:
Hi,
Is it possible to truncate the digits after decimal point in Metapost when using textext()? Please see the minimal example below which produces 1.84375. Can I just keep the first digit and have it produce 1.8 ?
Thanks.
If you are using mkiv, you can use lua to truncate a number.
\unexpanded\def\truncate#1{\ctxlua{context("\%.1f", #1)}}
\startMPdefinitions def truncatedtext(expr s) = textext("\truncate{" & s & "}") enddef ; \stopMPdefinitions
\starttext \startuseMPgraphic{Figure} u := 1cm; pickup pencircle scaled 2pt; % default pen thickness %TheFunction vardef f(expr x) = (10/x)-x*((0.5)**x) enddef; %Labels %label.lft(textext("\truncate{" & decimal f(5) & "}"),(0,f(5)) scaled u); label.lft(truncatedtext(decimal f(5)),(0,f(5)) scaled u); \stopuseMPgraphic \useMPgraphic{Figure}
\stoptext
Aditya ___________________________________________________________________________________ If your question is of interest to others as well, please add an entry to the Wiki!
maillist : ntg-context@ntg.nl / http://www.ntg.nl/mailman/listinfo/ntg-context webpage : http://www.pragma-ade.nl / http://tex.aanhet.net archive : http://foundry.supelec.fr/projects/contextrev/ wiki : http://contextgarden.net ___________________________________________________________________________________
participants (3)
-
Aditya Mahajan
-
Curiouslearn
-
Taco Hoekwater