CONVERT and variables for arguments - Printable Version +- HP Forums (https://www.hpmuseum.org/forum) +-- Forum: HP Calculators (and very old HP Computers) (/forum-3.html) +--- Forum: HP Prime (/forum-5.html) +--- Thread: CONVERT and variables for arguments (/thread-4952.html) Pages: 1 2 RE: CONVERT and variables for arguments - StephenG1CMZ - 10-21-2015 06:59 PM IYou might be interested to know that I just asked in another thread about using unit prefixes (milli,nano etc. ) in user inputs. Conversions Implemented as a Function - epp - 10-22-2015 11:35 AM Thought I'd re-invent the wheel again. Listed below is a function to convert, CNV(X), where X can be a real (20) or a unit (20_cm). Two unit conversions, for distance and volume, and a driver to do the selection are included. Usage: RPN: 20 ENTER CNV TEXTBOOK: CNV(20) If the original number you are converting is in units the answer will be in terms of units. For example, when converting 18 from inches to feet we have 18_inch -> 1.5_ft 18 -> 1.5 The following code can easily be extended to include other data types. Code: ``` Distance(); Volume(); EXPORT CnvApp; EXPORT CNV(x) begin   local t = type(x);   if (t <> 0) and (t <> 9) then msgbox("Input must be REAL or UNIT"); return x; end;   choose(CnvApp, "convert", {"Distance", "Volume", "Weight", "Temperature"} );   if (CnvApp == 1) then return Distance(x, t); end;   if (CnvApp == 2) then return Volume(x, t); end; end; EXPORT CnvDistFrom,CnvDistTo; Distance(x, t) begin   local menu,unit;   unit := {1_mm, 1_cm, 1_m, 1_km, 1_inch, 1_ft, 1_yd, 1_mile};   menu := {"mm", "cm", "m", "km", "inches", "feet", "yards", "miles"};   if (t == 0) then     choose(CnvDistFrom, "From", menu);     x := x * unit[CnvDistFrom];   end;   choose(CnvDistTo, "To", menu);   x := convert(x, unit[CnvDistTo]);   if (t == 0) then x := x / unit[CnvDistTo]; else x; end; end; EXPORT CnvVolFrom,CnvVolTo; Volume(x, t) begin   local menu,unit;   unit := {1_ml, 1_l, 1_tsp, 1_tbsp, 1_qt};   menu := {"ml", "liter", "tsp", "tbsp", "qt"};   if (t == 0) then     choose(CnvVolFrom, "From", menu);     x := x * unit[CnvVolFrom];   end;   choose(CnvVolTo, "To", menu);   x := convert(x, unit[CnvVolTo]);   if (t == 0) then x := x / unit[CnvVolTo]; else x; end; end;``` To place CNV on the command line choose Toolbox > User > CNV > CNV If you have previously visited this menu then choose Toolbox and keep pressing ENTER. Previous choices are saved by both the PRIME and the CNV program. Alternatively you can bind a key to insert "CNV" and then choose Shift > Help > KEY where KEY is the one you bind to CNV. The following code binds the Units key to CNV. Code: ``` KEY K_Templ() BEGIN RETURN "CNV"; END;``` On a small screen selecting menu items while running CNV can be a challenge. Instead use the rocker to navigate to the selection or use the keyboard and choose a number that corresponds to the selection. RE: CONVERT and variables for arguments - StephenG1CMZ - 10-22-2015 11:12 PM I have now implemented handling of SI prefixes in V0.2 of my ZIPP unit conversion utility. The user can now type in inputs such as 3*NANO. Selecting Units/Prefixes is not useful in this program, the name has to be typed in. RE: CONVERT and variables for arguments - epp - 10-24-2015 09:35 PM By storing information in lists the code is shorter and modification is easier. The function, CNV(X), converts between units where X can be a real (18) or a unit (18_inch). Distance, Volume, and Weight have been implemented. Works under HOME and CAS. RPN: 18 ENTER CNV TEXTBOOK: CNV(18) If the original number you are converting from is in units the answer will be in terms of units. For example, when converting 18 inches to feet we have CNV(18_inch) -> 1.5_ft CNV(18) -> 1.5 The following code can easily be modified to include other data types. Code: ``` #pragma mode(separator(.,;) integer(h32)) // when changing menus update the following: cFr, cTo, unit, prog cFr = {1,1,1}; cTo = {1,1,1}; iPr; EXPORT CNV(x) begin   local unit = {     {"mm", "cm", "m", "km", "inch", "ft", "yd", "mile"},     {"ml", "l", "tsp", "tbsp", "qt", "inch^3", "ft^3"},     {"g", "kg", "oz", "lb"}   };   local prog = {     "Distance",     "Volume",     "Weight"   };   local t = type(x);   local x0 = x;   local uFr, uTo, n;   if (t <> 0) and (t <> 9) then msgbox("Input must be REAL or UNIT"); return x; end;   choose(iPr, "convert", prog);   if (iPr == 0) then return x0; end;   if (t == 0) then     n := cFr[iPr];     choose(n, "From", unit[iPr]);     if (n == 0) then return x0; end;     uFr := expr("1_" + unit[iPr,n]);     x := x * uFr;     cFr[iPr] := n;   end;   n := cTo[iPr];   choose(n, "To", unit[iPr]);   if (n == 0) then return x0; end;   uTo := expr("1_" + unit[iPr,n]);   x := convert(x, uTo);   cTo[iPr] := n;   if (t == 0) then x := x / uTo; else x; end; end;``` To place CNV on the command line choose Toolbox > User > CNV > CNV If you have previously visited this menu then choose Toolbox and keep pressing ENTER. Previous choices are saved by both the calculator and the CNV program. Alternatively you can bind a key to insert "CNV" and then choose Shift > Help > KEY where KEY is the one you bind to CNV. The following code binds the Units key to CNV. Code: ``` KEY K_Templ() BEGIN RETURN "CNV"; END;``` On a small screen selecting menu items while running CNV can be a challenge. Instead use the rocker to navigate to the selection or use the keyboard and choose a number that corresponds to the selection. Implementing temperature conversions (Fahrenheit/Celsius) fail under firmware 8151 due to the lack of arithmetic support. RE: CONVERT and variables for arguments - StephenG1CMZ - 10-30-2015 08:26 AM Version 0.4 of my ZIPP program now handles temperature conversion too (though not the same way as other unit conversions). Nice to see your program is now in the library, epp.