Revision: 3429 http://vexi.svn.sourceforge.net/vexi/?rev=3429&view=rev Author: clrg Date: 2009-03-17 05:20:52 +0000 (Tue, 17 Mar 2009)
Log Message: ----------- fix parseInt returning NaN on '0' Modified Paths: -------------- trunk/core/org.ibex.js/src/org/ibex/js/Methods.java Modified: trunk/core/org.ibex.js/src/org/ibex/js/Methods.java =================================================================== --- trunk/core/org.ibex.js/src/org/ibex/js/Methods.java 2009-03-17 05:19:58 UTC (rev 3428) +++ trunk/core/org.ibex.js/src/org/ibex/js/Methods.java 2009-03-17 05:20:52 UTC (rev 3429) @@ -8,39 +8,43 @@ int radix = JSU.toInt(r); String s = JSU.toString(arg); int start = 0; - int length = s.length(); int sign = 1; + int end = s.length(); long n = 0; if (radix != 0 && (radix < 2 || radix > 36)) return NC_NaN; - while (start < length && Character.isWhitespace(s.charAt(start))) start++; - if ((length >= start+1) && (s.charAt(start) == '+' || s.charAt(start) == '-')) { + while (start < end && Character.isWhitespace(s.charAt(start))) start++; + while (start < end && Character.isWhitespace(s.charAt(end-1))) end--; + if ((end >= start+1) && (s.charAt(start) == '+' || s.charAt(start) == '-')) { sign = s.charAt(start) == '+' ? 1 : -1; start++; } - if(radix == 0 && length >= start+1 && s.charAt(start) == '0') { + if (end == start+1 && s.charAt(start) == '0') { + return NC_0; + } + if (radix == 0 && end >= start+1 && s.charAt(start) == '0') { start++; - if(length >= start+1 && (s.charAt(start) == 'x' || s.charAt(start) == 'X')) { + if (end >= start+1 && (s.charAt(start) == 'x' || s.charAt(start) == 'X')) { start++; radix = 16; } else { radix = 8; } } - if(radix == 0) radix = 10; - if(length == start || Character.digit(s.charAt(start),radix) == -1) return NC_NaN; + if (radix == 0) radix = 10; + if (end == start || Character.digit(s.charAt(start),radix) == -1) return NC_NaN; // try the fast way first try { - String s2 = start == 0 ? s : s.substring(start); + String s2 = start == 0 ? s : s.substring(start, end); return JSU.N(sign*Integer.parseInt(s2,radix)); } catch(NumberFormatException e) { } // fall through to a slower but emca-compliant method - for(int i=start;i<length;i++) { + for (int i=start;i<end;i++) { int digit = Character.digit(s.charAt(i),radix); - if(digit < 0) break; + if (digit < 0) break; n = n*radix + digit; - if(n < 0) return NC_NaN; // overflow; + if (n < 0) return NC_NaN; // overflow; } - if(n <= Integer.MAX_VALUE) return JSU.N(sign*(int)n); + if (n <= Integer.MAX_VALUE) return JSU.N(sign*(int)n); return JSU.N((long)sign*n); } This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. ------------------------------------------------------------------------------ Apps built with the Adobe(R) Flex(R) framework and Flex Builder(TM) are powering Web 2.0 with engaging, cross-platform capabilities. Quickly and easily build your RIAs with Flex Builder, the Eclipse(TM)based development software that enables intelligent coding and step-through debugging. Download the free 60 day trial. http://p.sf.net/sfu/www-adobe-com _______________________________________________ Vexi-svn mailing list Vexi-svn@lists.sourceforge.net https://lists.sourceforge.net/lists/listinfo/vexi-svn