mmidy 00/10/03 13:37:51
Modified: java/src/org/apache/xpath/objects XNumber.java
Log:
Do number formatting here instead of using java.text.DecimalFormat
Revision Changes Path
1.3 +35 -15 xml-xalan/java/src/org/apache/xpath/objects/XNumber.java
Index: XNumber.java
===================================================================
RCS file: /home/cvs/xml-xalan/java/src/org/apache/xpath/objects/XNumber.java,v
retrieving revision 1.2
retrieving revision 1.3
diff -u -r1.2 -r1.3
--- XNumber.java 2000/09/26 14:57:27 1.2
+++ XNumber.java 2000/10/03 20:37:49 1.3
@@ -124,24 +124,44 @@
return "Infinity";
else
return "-Infinity";
- }
-
- // java.text.NumberFormat formatter
- // = java.text.NumberFormat.getNumberInstance();
- java.text.DecimalFormat formatter = new
java.text.DecimalFormat("0.##################");
-
- String s = formatter.format(m_val);
+ }
- // Hack to get around some VMs tendency to format integers to '1.0'
- // instead of '1'. I would rather do that than muck with the pattern
- // handed in to NumberFormat, since that is locale specific.
- // (not that this is locale sensitive... but at least it should be
- // non-harmful in the case of a different locale...).
- if(s.endsWith(".0"))
+ double num = m_val;
+ String s = Double.toString(num);
+ int len = s.length();
+ if (s.charAt(len - 2) == '.' && s.charAt(len - 1) == '0')
{
- s = s.substring(0, s.length() - 2);
+ s = s.substring(0, len - 2);
+ if (s.equals("-0"))
+ return "0";
+ return s;
}
- return s;
+ int e = s.indexOf('E');
+ if (e < 0)
+ return s;
+ int exp = Integer.parseInt(s.substring(e + 1));
+ String sign;
+ if (s.charAt(0) == '-')
+ {
+ sign = "-";
+ s = s.substring(1);
+ --e;
+ }
+ else
+ sign = "";
+ int nDigits = e - 2;
+ if (exp >= nDigits)
+ return sign + s.substring(0, 1) + s.substring(2, e) + zeros(exp -
nDigits);
+ if (exp > 0)
+ return sign + s.substring(0, 1) + s.substring(2, 2 + exp) + "." +
s.substring(2 + exp, e);
+ return sign + "0." + zeros(-1 - exp) + s.substring(0, 1) +
s.substring(2, e);
+ }
+
+ static private String zeros(int n) {
+ char[] buf = new char[n];
+ for (int i = 0; i < n; i++)
+ buf[i] = '0';
+ return new String(buf);
}
/**