Should these changes be checked in to cvs?  If preferences.js were modified
to set a deault calculatorDecimal of ".", the toolbar would operate as it
does now, and anyone wanting the comma used as a separator could override
the setting in localprefs.js.   Or is this an isolated case where the
localization of Greg's machine isnt functioning properly?

Monty


> -----Original Message-----
> From: [EMAIL PROTECTED]
> [mailto:[EMAIL PROTECTED]]On Behalf Of Krohne
> Gregory Contr AFRC/SCOS
> Sent: Thursday, January 30, 2003 3:31 PM
> To: '[EMAIL PROTECTED]'
> Subject: RE: [DQSD-Users] Calculator problem: comma vs. period
>
>
> Okay, let's make it a little less cheesy. Add a line to localprefs.js that
> defines a decimal separator character; call it calculatorDecimal:
>
> <localprefs.js>
> /* Calculator decimal separator character.
> *  Value can be almost any character not used for computation.
> *  Default value is '.' (period), if no value is set
> */
> calculatorDecimal = ",";
>
> In calculate.js, add a little more code to check for variable
> calculatorDecimal and use it:
>
> <calculate.js>
>  9    if (typeof calculatorDecimal != "undefined" && calculatorDecimal !=
> "") {
> 10            var re = new RegExp("\\" + calculatorDecimal, "g");
> 11            expr = expr.replace(re, ".");
> 12    }
>
> Lines 24 & 25 have been inserted before original line 24 (now 26).
>
> 24            if (typeof calculatorDecimal != "undefined" &&
> calculatorDecimal != "")
> 25                    answer = answer.toString().replace(/\./g,
> calculatorDecimal);
> 26            setSearchWindowText(answer, true);
>
> Now, we can use comma for a decimal separator, and the answer will use the
> comma, too. I included a sample localprefs.js and a modified calculate.js
> file at the bottom of this message. Of course, we still have the same
> problem with updates: our new calculate.js will be overwritten. Moreover,
> this fix shouldn't be necessary in the first place: the JavaScript math
> functions should be sufficiently region-aware to format numbers correctly.
> It's possible that we could use the javascript function
> navigator.systemLanguage to make a best guess about how to format numbers.
> I'll submit a feature request to include this particular change,
> and perhaps
> another feature request to support regional settings in general.
>
> Regards,
> Gregory Krohne
>
> > From: "Monty Scroggins" <[EMAIL PROTECTED]>
> > To: <[EMAIL PROTECTED]>
> > Subject: RE: [DQSD-Users] Calculator problem: comma vs. period
> > Date: Thu, 30 Jan 2003 10:02:28 -0600
> > Reply-To: [EMAIL PROTECTED]
> >
> > hmmm    This is cheesy workaround for this problem, but you
> > could maybe add
> > this line - var expr =3D expr.replace(/\,/g, ".");  at line 9
> > of calculat= e.js. This replaces any commas with decimals in
> > the math expression..
> >
> > Of course every toolbar upgrade will overwrite calculate.js,
> > so you will need to make this change again if you upgrade....
> >
> > Monty
> >
> >
> > >
> > > This is a real problem, becouse almost everywhere else it's a comma,
> > > like 234,5+15 which gives weird results like 20??
> > >
> > > Is this a localized problem, becouse I live in Finland and here the
> > > decimal-separator is always a comma?
> > >
> > > If I copy&paste some numbers, I have to change the commas to periods
> > > for the calculator to work.
> > > Is there any solution that could fix the problem?
> > >
> > > Best regards,
> > > Janne Riihim=E4ki
>
> /* localprefs.js
> *
> * Add preferences here to keep them from being overwritten on upgrades.
> *
> * Use preferences.js as a guide, copying settings from that
> * file to this file, and then modifying them to suit your
> * personal taste.
> */
>
> /* Calculator decimal separator character.
> *  Value can be almost any character not used for computation.
> *  Default value is '.' (period), if no value is set
> */
> calculatorDecimal = ",";
>
> /* calculate.js
> * offline calculator
> */
> function calculate(expr)
> {
>   if (expr.match(/=ERR$/))
>     return;
>
>   try
>   {
>     if (typeof calculatorDecimal != "undefined" &&
> calculatorDecimal != "")
> {
>       var re = new RegExp("\\" + calculatorDecimal, "g");
>       expr = expr.replace(re, ".");
>     }
>     with(Math)
>     {
>       var answer = eval(expr);
>       if (typeof(answer) == "number")
>       {
>         // for the sake of pretty decimal numbers,
>         // round numbers that are very close to a ten-millionth
>         if (abs(answer) >= 0.001 &&
>             abs(round(answer * 1e+7) - answer * 1e+7) < 0.001)
>           answer = round(answer * 1e+7)/1e+7;
>       }
>         if (typeof calculatorDecimal != "undefined" && calculatorDecimal
> != "")
>               answer = answer.toString().replace(/\./g,
> calculatorDecimal);
>         setSearchWindowText(answer, true);
>     }
>   }
>   catch (exception)
>   {
>     setSearchWindowText(expr + "=ERR=", true);
>   }
>
>   savevars();
> }
>
> // based log functions
> function log10(n) { return ln(n)/ln10; }
> function log2(n) { return ln(n)/ln2; }
>
> // hex conversion for use in calculator
> function hex(i)
> {
>   hexChars = "0123456789abcdef";
>   var h = "";
>   var n = 256;
>
>   while (i < 0)
>   {
>      if (i + n / 16 > 0) { i += n; break; }
>      n = n * n;
>   }
>
>   while (i > 0)
>   {
>      h = hexChars.charAt(i % 16) + h;
>      i = Math.floor(i / 16);
>   }
>
>   if (h == "")
>      h = "0";
>
>   return "0x" + h;
> }
>
> // octal conversion for use in calculator
> function oct(i)
> {
>   octChars = "01234567";
>   var h = "";
>   var n = 512;
>
>   while (i < 0)
>   {
>      if (i + n / 8 > 0) { i += n; break; }
>      n = n * n;
>   }
>
>   while (i > 0)
>   {
>      h = octChars.charAt(i % 8) + h;
>      i = Math.floor(i / 8);
>   }
>
>   if (h == "")
>      h = "0";
>
>   return "0" + h;
> }
>
> // binary conversion for use in calculator
> function bin(i)
> {
>   binChars = "01";
>   var h = "";
>   var n = 16;
>
>   while (i < 0)
>   {
>      if (i + n / 2 > 0) { i += n; break; }
>      n = n * n;
>   }
>
>   while (i > 0)
>   {
>      h = binChars.charAt(i % 2) + h;
>      i = Math.floor(i / 2);
>   }
>
>   if (h == "")
>      h = "0";
>
>   return h;
> }
>
>
> // detect numeric math expressions to execute right away
> function mathexp(t)
> {
>   // chop out variables
>   var noconst =
> t.replace(/\b(PI|E|LOG2E|LOG10E|LN2|LN10|SQRT2|SQRT1_2|pi)\b/g, "_");
>   // experiment: also allow "longvarname="
>   var noconst = noconst.replace(/^[a-zA-Z_]+\s*=/, "a=");
>   // it's only an expression if it ends with a digit, paren, or variable
>   if (!noconst.match(/\b[a-z]$|[_\d\)]$/)) return false;
>   // chop out function names
>   var nofunc =
> noconst.replace(/\b(ln|log10|log2|hex|oct|bin|abs|acos|asin|atan|a
> tan2|ceil|
> cos|exp|floor|log|max|min|pow|random|round|sin|sqrt|tan)\(/g, "(");
>   // it's only an expression if it begins with a digit, paren, or
> variable -
> or a minus
>   if (!nofunc.match(/^[a-z_]\b|^[x\d\-\.\(]/)) return false;
>   // detect numbers
>   var nonum = nofunc.replace(/\b(\d+(\.\d*)?)([eE][+-]?\d+)?\b/g, "1");
>   var nonum = nonum.replace(/(\.\d+)([eE][+-]?\d+)?\b/g, "1");
>   // remove spsaces
>   var nospace = nonum.replace(/\s/g, "");
>   // only operators and recognized things are allowed
>   if (!nospace.match(/^[1_a-z\*\-\+\/\(\),=]+$/)) return false;
>   // constants cannot touch
>   if (nospace.match(/[1_a-z\)][1_a-z\(]/)) return false;
>   // operators cannot touch
>   if (nospace.match(/[\*\-\+\/][\*\+\/=]/)) return false;
>   // parens must match
>   var paren = 0;
>   var eq = 0;
>   var i;
>   for (i = nospace.length - 1; i >= 0; i--)
>   {
>     var ch = nospace.charAt(i);
>     if (eq == 1)
>     {
>       if (ch < 'a' || ch > 'z') return false;
>     }
>     else
>     {
>       if (ch >= 'a' && ch <= 'z' && eval("typeof " + ch) == "undefined")
> return false;
>     }
>     if (ch == '=') { eq++; }
>     if (ch == ')') { paren++; }
>     if (ch == '(') { paren--; }
>     if (paren < 0) return false;
>     if (eq > 1) return false;
>   }
>
>   // looks like an expression: we can calc it
>   calculate(t);
>   return true;
> }
>
>
> function savevars()
> {
>   var savetext = "";
>   for (var ii = 'a'.charCodeAt(0); ii <= 'z'.charCodeAt(0); ii++)
>   {
>     var varname = String.fromCharCode(ii);
>     var vartype = eval("typeof " + varname);
>     if (vartype == "number" || vartype == "string")
>     {
>        savetext += varname + "\t" + vartype + "\t" +
> escape(eval(varname)) +
> "\r\n";
>     }
>   }
>   for (var ii = 'A'.charCodeAt(0); ii <= 'Z'.charCodeAt(0); ii++)
>   {
>     var varname = String.fromCharCode(ii);
>     var vartype = eval("typeof " + varname);
>     if (vartype == "number" || vartype == "string")
>     {
>        savetext += varname + "\t" + vartype + "\t" +
> escape(eval(varname)) +
> "\r\n";
>     }
>   }
>   writeFile("calcmem", savetext);
> }
>
> function loadvars()
> {
>   var values = readTabDelimitedFile("calcmem")
>   for (var ii = 0; ii < values.length; ii++)
>   {
>     var value = values[ii];
>     if (value.length == 3)
>     {
>       if (value[1] == "number")
>       {
>         eval(value[0] + " = " + unescape(value[2]));
>       }
>       else if (value[1] == "string")
>       {
>         var strval = unescape(value[2]);
>         eval(value[0] + " = strval");
>       }
>     }
>   }
> }
>
> loadvars();
>
> // constants for use in calculator
> pi = Math.PI;
> ln10 = Math.LN10;
> ln2 = Math.LN2;
> log10e = Math.LOG10E;
> log2e = Math.LOG2E;
> sqrt1_2 = Math.SQRT1_2;
> sqrt2 = Math.SQRT2;
> ln = Math.log;
> e = Math.exp(1);
>
>
>
> -------------------------------------------------------
> This SF.NET email is sponsored by:
> SourceForge Enterprise Edition + IBM + LinuxWorld = Something 2 See!
> http://www.vasoftware.com
> _______________________________________________
> To unsubscribe visit:
> https://lists.sourceforge.net/lists/listinfo/dqsd-users
> [EMAIL PROTECTED]
> http://sourceforge.net/mailarchive/forum.php?forum_id=8601
>



-------------------------------------------------------
This SF.NET email is sponsored by:
SourceForge Enterprise Edition + IBM + LinuxWorld = Something 2 See!
http://www.vasoftware.com
_______________________________________________
To unsubscribe visit:
https://lists.sourceforge.net/lists/listinfo/dqsd-users
[EMAIL PROTECTED]
http://sourceforge.net/mailarchive/forum.php?forum_id=8601

Reply via email to