/*
- * 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 <http://www.gnu.org/licenses/>.
+ * The Jalview Authors are detailed in the 'AUTHORS' file.
*/
/**
* A class for formatting numbers that follows printf conventions.
*/
package jalview.util;
+import java.util.Arrays;
+
/**
* DOCUMENT ME!
*
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 = "";
* 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
- * <ul>
- * <li> a % (required)
- * <li> a modifier (optional)
- * <dl>
- * <dt> +
- * <dd> forces display of + for positive numbers
- * <dt> 0
- * <dd> show leading zeroes
- * <dt> -
- * <dd> align left in the field
- * <dt> space
- * <dd> prepend a space in front of positive numbers
- * <dt> #
- * <dd> use "alternate" format. Add 0 or 0x for octal or
- * hexadecimal numbers. Don't suppress trailing zeroes in
- * general floating point format.
- * </dl>
- * <li> an integer denoting field width (optional)
- * <li> a period followed by an integer denoting precision
- * (optional)
- * <li> a format descriptor (required)
- * <dl>
- * <dt>f
- * <dd> floating point number in fixed format
- * <dt>e, E
- * <dd> 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.
- * <dt>g, G
- * <dd> 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.
- * <dt>d, i
- * <dd> integer in decimal
- * <dt>x
- * <dd> integer in hexadecimal
- * <dt>o
- * <dd> integer in octal
- * <dt>s
- * <dd> string
- * <dt>c
- * <dd> character
- * </dl>
- * </ul>
+ * 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
+ * <ul>
+ * <li>a % (required)
+ * <li>a modifier (optional)
+ * <dl>
+ * <dt>+
+ * <dd>forces display of + for positive numbers
+ * <dt>0
+ * <dd>show leading zeroes
+ * <dt>-
+ * <dd>align left in the field
+ * <dt>space
+ * <dd>prepend a space in front of positive numbers
+ * <dt>#
+ * <dd>use "alternate" format. Add 0 or 0x for octal or hexadecimal
+ * numbers. Don't suppress trailing zeroes in general floating point
+ * format.
+ * </dl>
+ * <li>an integer denoting field width (optional)
+ * <li>a period followed by an integer denoting precision (optional)
+ * <li>a format descriptor (required)
+ * <dl>
+ * <dt>f
+ * <dd>floating point number in fixed format
+ * <dt>e, E
+ * <dd>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.
+ * <dt>g, G
+ * <dd>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.
+ * <dt>d, i
+ * <dd>integer in decimal
+ * <dt>x
+ * <dd>integer in hexadecimal
+ * <dt>o
+ * <dd>integer in octal
+ * <dt>s
+ * <dd>string
+ * <dt>c
+ * <dd>character
+ * </dl>
+ * </ul>
* @exception IllegalArgumentException
- * if bad format
+ * if bad format
*
*/
public static String getHexString(java.awt.Color color)
* 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)
{
* 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)
{
* 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)
{
* 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)
{
* 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)
* 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)
* DOCUMENT ME!
*
* @param s
- * DOCUMENT ME!
+ * DOCUMENT ME!
* @param base
- * DOCUMENT ME!
+ * DOCUMENT ME!
*
* @return DOCUMENT ME!
*/
* Converts a string of digits to an double
*
* @param s
- * a string
+ * a string
*/
public static double atof(String s)
{
* 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)
{
* 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)
/**
* 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)
/**
* 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)
}
/**
- * 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!
*/
* DOCUMENT ME!
*
* @param r
- * DOCUMENT ME!
+ * DOCUMENT ME!
*
* @return DOCUMENT ME!
*/
* DOCUMENT ME!
*
* @param s
- * DOCUMENT ME!
+ * DOCUMENT ME!
* @param r
- * DOCUMENT ME!
+ * DOCUMENT ME!
*
* @return DOCUMENT ME!
*/
{
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;
}
* DOCUMENT ME!
*
* @param d
- * DOCUMENT ME!
+ * DOCUMENT ME!
*
* @return DOCUMENT ME!
*/
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";
* DOCUMENT ME!
*
* @param d
- * DOCUMENT ME!
+ * DOCUMENT ME!
*
* @return DOCUMENT ME!
*/
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;
}
}
return fixed_format(d);
}
- d = d * factor;
- f = f + fixed_format(d);
+ f = f + fixed_format(dd);
if ((fmt == 'e') || (fmt == 'g'))
{
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--;
+ }
+ }
+ }
}