X-Git-Url: http://source.jalview.org/gitweb/?a=blobdiff_plain;f=src%2Fjalview%2Futil%2FFormat.java;h=ce7ab6df184a5984bd2262536dc43799e9bf4ce9;hb=a69ff693f6d3bc0969874e12812316a9c0bbc6fd;hp=49e4027a81fa85ec1513150c6723166085f0204f;hpb=2de8acfae59aced665e4c37ad0f7dcc2ed68818e;p=jalview.git
diff --git a/src/jalview/util/Format.java b/src/jalview/util/Format.java
index 49e4027..ce7ab6d 100755
--- a/src/jalview/util/Format.java
+++ b/src/jalview/util/Format.java
@@ -1,20 +1,22 @@
/*
- * Jalview - A Sequence Alignment Editor and Viewer (Development Version 2.4.1)
- * Copyright (C) 2009 AM Waterhouse, J Procter, G Barton, M Clamp, S Searle
+ * Jalview - A Sequence Alignment Editor and Viewer ($$Version-Rel$$)
+ * Copyright (C) $$Year-Rel$$ The Jalview Authors
*
- * This program is free software; you can redistribute it and/or
- * modify it under the terms of the GNU General Public License
- * as published by the Free Software Foundation; either version 2
- * of the License, or (at your option) any later version.
+ * This file is part of Jalview.
*
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
+ * Jalview is free software: you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * as published by the Free Software Foundation, either version 3
+ * of the License, or (at your option) any later version.
+ *
+ * Jalview is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty
+ * of MERCHANTABILITY or FITNESS FOR A PARTICULAR
+ * PURPOSE. See the GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA
+ * along with Jalview. If not, see .
+ * The Jalview Authors are detailed in the 'AUTHORS' file.
*/
/**
* A class for formatting numbers that follows printf conventions.
@@ -24,6 +26,8 @@
*/
package jalview.util;
+import java.util.Arrays;
+
/**
* DOCUMENT ME!
*
@@ -52,14 +56,17 @@ public class Format
private char fmt; // one of cdeEfgGiosxXos
+ private final String formatString;
+
/**
* Creates a new Format object.
*
* @param s
- * DOCUMENT ME!
+ * DOCUMENT ME!
*/
public Format(String s)
{
+ formatString = s;
width = 0;
precision = -1;
pre = "";
@@ -212,60 +219,57 @@ public class Format
* more than one number
*
* @param s
- * the format string following printf conventions The string
- * has a prefix, a format code and a suffix. The prefix and
- * suffix become part of the formatted output. The format code
- * directs the formatting of the (single) parameter to be
- * formatted. The code has the following structure
- *
- * - a % (required)
- *
- a modifier (optional)
- *
- * - +
- *
- forces display of + for positive numbers
- *
- 0
- *
- show leading zeroes
- *
- -
- *
- align left in the field
- *
- space
- *
- prepend a space in front of positive numbers
- *
- #
- *
- use "alternate" format. Add 0 or 0x for octal or
- * hexadecimal numbers. Don't suppress trailing zeroes in
- * general floating point format.
- *
- * - an integer denoting field width (optional)
- *
- a period followed by an integer denoting precision
- * (optional)
- *
- a format descriptor (required)
- *
- * - f
- *
- floating point number in fixed format
- *
- e, E
- *
- floating point number in exponential notation
- * (scientific format). The E format results in an uppercase E
- * for the exponent (1.14130E+003), the e format in a lowercase
- * e.
- *
- g, G
- *
- floating point number in general format (fixed format
- * for small numbers, exponential format for large numbers).
- * Trailing zeroes are suppressed. The G format results in an
- * uppercase E for the exponent (if any), the g format in a
- * lowercase e.
- *
- d, i
- *
- integer in decimal
- *
- x
- *
- integer in hexadecimal
- *
- o
- *
- integer in octal
- *
- s
- *
- string
- *
- c
- *
- character
- *
- *
+ * the format string following printf conventions The string has a
+ * prefix, a format code and a suffix. The prefix and suffix become
+ * part of the formatted output. The format code directs the
+ * formatting of the (single) parameter to be formatted. The code has
+ * the following structure
+ *
+ * - a % (required)
+ *
- a modifier (optional)
+ *
+ * - +
+ *
- forces display of + for positive numbers
+ *
- 0
+ *
- show leading zeroes
+ *
- -
+ *
- align left in the field
+ *
- space
+ *
- prepend a space in front of positive numbers
+ *
- #
+ *
- use "alternate" format. Add 0 or 0x for octal or hexadecimal
+ * numbers. Don't suppress trailing zeroes in general floating point
+ * format.
+ *
+ * - an integer denoting field width (optional)
+ *
- a period followed by an integer denoting precision (optional)
+ *
- a format descriptor (required)
+ *
+ * - f
+ *
- floating point number in fixed format
+ *
- e, E
+ *
- floating point number in exponential notation (scientific
+ * format). The E format results in an uppercase E for the exponent
+ * (1.14130E+003), the e format in a lowercase e.
+ *
- g, G
+ *
- floating point number in general format (fixed format for
+ * small numbers, exponential format for large numbers). Trailing
+ * zeroes are suppressed. The G format results in an uppercase E for
+ * the exponent (if any), the g format in a lowercase e.
+ *
- d, i
+ *
- integer in decimal
+ *
- x
+ *
- integer in hexadecimal
+ *
- o
+ *
- integer in octal
+ *
- s
+ *
- string
+ *
- c
+ *
- character
+ *
+ *
* @exception IllegalArgumentException
- * if bad format
+ * if bad format
*
*/
public static String getHexString(java.awt.Color color)
@@ -301,11 +305,11 @@ public class Format
* prints a formatted number following printf conventions
*
* @param s
- * a PrintStream
+ * a PrintStream
* @param fmt
- * the format string
+ * the format string
* @param x
- * the double to print
+ * the double to print
*/
public static void print(java.io.PrintStream s, String fmt, double x)
{
@@ -316,11 +320,11 @@ public class Format
* prints a formatted number following printf conventions
*
* @param s
- * a PrintStream
+ * a PrintStream
* @param fmt
- * the format string
+ * the format string
* @param x
- * the long to print
+ * the long to print
*/
public static void print(java.io.PrintStream s, String fmt, long x)
{
@@ -331,11 +335,11 @@ public class Format
* prints a formatted number following printf conventions
*
* @param s
- * a PrintStream
+ * a PrintStream
* @param fmt
- * the format string
+ * the format string
* @param x
- * the character to
+ * the character to
*/
public static void print(java.io.PrintStream s, String fmt, char x)
{
@@ -346,9 +350,9 @@ public class Format
* prints a formatted number following printf conventions
*
* @param s
- * a PrintStream, fmt the format string
+ * a PrintStream, fmt the format string
* @param x
- * a string that represents the digits to print
+ * a string that represents the digits to print
*/
public static void print(java.io.PrintStream s, String fmt, String x)
{
@@ -359,7 +363,7 @@ public class Format
* Converts a string of digits (decimal, octal or hex) to an integer
*
* @param s
- * a string
+ * a string
* @return the numeric value of the prefix of s representing a base 10 integer
*/
public static int atoi(String s)
@@ -371,7 +375,7 @@ public class Format
* Converts a string of digits (decimal, octal or hex) to a long integer
*
* @param s
- * a string
+ * a string
* @return the numeric value of the prefix of s representing a base 10 integer
*/
public static long atol(String s)
@@ -405,9 +409,9 @@ public class Format
* DOCUMENT ME!
*
* @param s
- * DOCUMENT ME!
+ * DOCUMENT ME!
* @param base
- * DOCUMENT ME!
+ * DOCUMENT ME!
*
* @return DOCUMENT ME!
*/
@@ -463,7 +467,7 @@ public class Format
* Converts a string of digits to an double
*
* @param s
- * a string
+ * a string
*/
public static double atof(String s)
{
@@ -537,10 +541,10 @@ public class Format
* Formats a double into a string (like sprintf in C)
*
* @param x
- * the number to format
+ * the number to format
* @return the formatted string
* @exception IllegalArgumentException
- * if bad argument
+ * if bad argument
*/
public String form(double x)
{
@@ -579,7 +583,7 @@ public class Format
* Formats a long integer into a string (like sprintf in C)
*
* @param x
- * the number to format
+ * the number to format
* @return the formatted string
*/
public String form(long x)
@@ -623,8 +627,8 @@ public class Format
/**
* Formats a character into a string (like sprintf in C)
*
- * @param x
- * the value to format
+ * @param debounceTrap
+ * the value to format
* @return the formatted string
*/
public String form(char c)
@@ -642,8 +646,8 @@ public class Format
/**
* Formats a string into a larger string (like sprintf in C)
*
- * @param x
- * the value to format
+ * @param debounceTrap
+ * the value to format
* @return the formatted string
*/
public String form(String s)
@@ -662,43 +666,35 @@ public class Format
}
/**
- * DOCUMENT ME!
+ * Returns a string consisting of n repeats of character c
*
* @param c
- * DOCUMENT ME!
* @param n
- * DOCUMENT ME!
*
- * @return DOCUMENT ME!
+ * @return
*/
- private static String repeat(char c, int n)
+ static String repeat(char c, int n)
{
if (n <= 0)
{
return "";
}
-
- StringBuffer s = new StringBuffer(n);
-
- for (int i = 0; i < n; i++)
- {
- s.append(c);
- }
-
- return s.toString();
+ char[] chars = new char[n];
+ Arrays.fill(chars, c);
+ return new String(chars);
}
/**
* DOCUMENT ME!
*
* @param x
- * DOCUMENT ME!
+ * DOCUMENT ME!
* @param n
- * DOCUMENT ME!
+ * DOCUMENT ME!
* @param m
- * DOCUMENT ME!
+ * DOCUMENT ME!
* @param d
- * DOCUMENT ME!
+ * DOCUMENT ME!
*
* @return DOCUMENT ME!
*/
@@ -724,7 +720,7 @@ public class Format
* DOCUMENT ME!
*
* @param r
- * DOCUMENT ME!
+ * DOCUMENT ME!
*
* @return DOCUMENT ME!
*/
@@ -746,9 +742,9 @@ public class Format
* DOCUMENT ME!
*
* @param s
- * DOCUMENT ME!
+ * DOCUMENT ME!
* @param r
- * DOCUMENT ME!
+ * DOCUMENT ME!
*
* @return DOCUMENT ME!
*/
@@ -794,8 +790,8 @@ public class Format
{
w = width;
}
- else if (((fmt == 'd') || (fmt == 'i') || (fmt == 'x') || (fmt == 'X') || (fmt == 'o'))
- && (precision > 0))
+ else if (((fmt == 'd') || (fmt == 'i') || (fmt == 'x') || (fmt == 'X')
+ || (fmt == 'o')) && (precision > 0))
{
w = precision;
}
@@ -807,7 +803,7 @@ public class Format
* DOCUMENT ME!
*
* @param d
- * DOCUMENT ME!
+ * DOCUMENT ME!
*
* @return DOCUMENT ME!
*/
@@ -837,7 +833,8 @@ public class Format
double factor = 1;
String leading_zeroes = "";
- for (int i = 1; (i <= precision) && (factor <= 0x7FFFFFFFFFFFFFFFL); i++)
+ for (int i = 1; (i <= precision)
+ && (factor <= 0x7FFFFFFFFFFFFFFFL); i++)
{
factor *= 10;
leading_zeroes = leading_zeroes + "0";
@@ -879,7 +876,7 @@ public class Format
* DOCUMENT ME!
*
* @param d
- * DOCUMENT ME!
+ * DOCUMENT ME!
*
* @return DOCUMENT ME!
*/
@@ -888,21 +885,18 @@ public class Format
String f = "";
int e = 0;
double dd = d;
- double factor = 1;
if (d != 0)
{
while (dd > 10)
{
e++;
- factor /= 10;
dd = dd / 10;
}
while (dd < 1)
{
e--;
- factor *= 10;
dd = dd * 10;
}
}
@@ -912,8 +906,7 @@ public class Format
return fixed_format(d);
}
- d = d * factor;
- f = f + fixed_format(d);
+ f = f + fixed_format(dd);
if ((fmt == 'e') || (fmt == 'g'))
{
@@ -939,4 +932,55 @@ public class Format
return f + p.substring(p.length() - 3, p.length());
}
+
+ @Override
+ public String toString()
+ {
+ return formatString;
+ }
+
+ /**
+ * Bespoke method to format percentage float value to the specified number of
+ * decimal places. Avoids use of general-purpose format parsers as a
+ * processing hotspot.
+ *
+ * @param sb
+ * @param value
+ * @param dp
+ */
+ public static void appendPercentage(StringBuilder sb, float value, int dp)
+ {
+ /*
+ * rounding first
+ */
+ double d = value;
+ long factor = 1L;
+ for (int i = 0; i < dp; i++)
+ {
+ factor *= 10;
+ }
+ d *= factor;
+ d += 0.5;
+
+ /*
+ * integer part
+ */
+ value = (float) (d / factor);
+ sb.append((long) value);
+
+ /*
+ * decimal places
+ */
+ if (dp > 0)
+ {
+ sb.append(".");
+ while (dp > 0)
+ {
+ value = value - (int) value;
+ value *= 10;
+ sb.append((int) value);
+ dp--;
+ }
+ }
+ }
}