package com.plectix.simulator.util;
import com.plectix.simulator.io.xml.SimulationDataXMLWriter;
import com.plectix.simulator.simulator.ThreadLocalData;
public final class DecimalFormatter {
public static final String toStringWithSetNumberOfFractionDigits(double number, int numberOfFractionDigits) {
return ThreadLocalData.getDecimalFormat(numberOfFractionDigits).format(number);
}
public static final String toStringWithSetNumberOfSignificantDigits(double number, int numberOfSignificantDigits) {
if (number > 0.0) {
return toStringWithSetNumberOfSignificantDigitsForPositiveNumbers(number, numberOfSignificantDigits);
} else if (number < 0.0) {
return "-" + toStringWithSetNumberOfSignificantDigitsForPositiveNumbers(Math.abs(number), numberOfSignificantDigits);
} else {
return "0.0";
}
}
private static final String toStringWithSetNumberOfSignificantDigitsForPositiveNumbers(double number, int numberOfSignificantDigits) {
if (number < 1.0) {
if (number < Double.MIN_VALUE) {
return "0.0"; // I think returning this should be fine...
// This returns extra zeros... But creates a new Formatter for each time we have this small numbers...
/* String format = "%." + numberOfSignificantDigits + "G";
Formatter fmt = new Formatter();
fmt.format(format, number);
return fmt.toString();
*/
}
return findNumberOfSignificantDigitsForPositiveNumbersLessThanOne(number, 1, numberOfSignificantDigits);
}
return findNumberOfSignificantDigitsForPositiveNumbersGreaterThanOne(number, 1, numberOfSignificantDigits);
}
private static final String findNumberOfSignificantDigitsForPositiveNumbersLessThanOne(double number, double upperLimit, int numberOfSignificantDigitsLeft) {
if (number > upperLimit) {
return ThreadLocalData.getDecimalFormat(numberOfSignificantDigitsLeft-1).format(number);
}
return findNumberOfSignificantDigitsForPositiveNumbersLessThanOne(number, upperLimit/10.0, numberOfSignificantDigitsLeft+1);
}
private static final String findNumberOfSignificantDigitsForPositiveNumbersGreaterThanOne(double number, int upperLimit, int numberOfSignificantDigitsLeft) {
if (numberOfSignificantDigitsLeft <= 0) {
return ThreadLocalData.getDecimalFormat(0).format(number);
}
if (number < upperLimit) {
return ThreadLocalData.getDecimalFormat(numberOfSignificantDigitsLeft).format(number);
}
return findNumberOfSignificantDigitsForPositiveNumbersGreaterThanOne(number, 10*upperLimit, numberOfSignificantDigitsLeft-1);
}
public static void main(String[] args) {
//TODO o_O
System.err.println("0.000000000012345678912 --> " + toStringWithSetNumberOfSignificantDigits( 0.000000000012345678912,SimulationDataXMLWriter.NUMBER_OF_SIGNIFICANT_DIGITS));
System.err.println("0.000000000123456789123 --> " + toStringWithSetNumberOfSignificantDigits( 0.000000000123456789123,SimulationDataXMLWriter.NUMBER_OF_SIGNIFICANT_DIGITS));
System.err.println("0.000000001234567891234 --> " + toStringWithSetNumberOfSignificantDigits( 0.000000001234567891234,SimulationDataXMLWriter.NUMBER_OF_SIGNIFICANT_DIGITS));
System.err.println("0.000000012345678912345 --> " + toStringWithSetNumberOfSignificantDigits( 0.000000012345678912345,SimulationDataXMLWriter.NUMBER_OF_SIGNIFICANT_DIGITS));
System.err.println("0.000000123456789123456 --> " + toStringWithSetNumberOfSignificantDigits( 0.000000123456789123456,SimulationDataXMLWriter.NUMBER_OF_SIGNIFICANT_DIGITS));
System.err.println("0.000001234567891234567 --> " + toStringWithSetNumberOfSignificantDigits( 0.000001234567891234567,SimulationDataXMLWriter.NUMBER_OF_SIGNIFICANT_DIGITS));
System.err.println("0.000012345678912345678 --> " + toStringWithSetNumberOfSignificantDigits( 0.000012345678912345678,SimulationDataXMLWriter.NUMBER_OF_SIGNIFICANT_DIGITS));
System.err.println("0.000123456789123456789 --> " + toStringWithSetNumberOfSignificantDigits( 0.000123456789123456789,SimulationDataXMLWriter.NUMBER_OF_SIGNIFICANT_DIGITS));
System.err.println("0.001234567891234567891 --> " + toStringWithSetNumberOfSignificantDigits( 0.001234567891234567891,SimulationDataXMLWriter.NUMBER_OF_SIGNIFICANT_DIGITS));
System.err.println("0.012345678912345678912 --> " + toStringWithSetNumberOfSignificantDigits( 0.012345678912345678912,SimulationDataXMLWriter.NUMBER_OF_SIGNIFICANT_DIGITS));
System.err.println("0.123456789123456789123 --> " + toStringWithSetNumberOfSignificantDigits( 0.123456789123456789123,SimulationDataXMLWriter.NUMBER_OF_SIGNIFICANT_DIGITS));
System.err.println("1 --> " + toStringWithSetNumberOfSignificantDigits( 1,SimulationDataXMLWriter.NUMBER_OF_SIGNIFICANT_DIGITS));
System.err.println("10 --> " + toStringWithSetNumberOfSignificantDigits( 10,SimulationDataXMLWriter.NUMBER_OF_SIGNIFICANT_DIGITS));
System.err.println("100 --> " + toStringWithSetNumberOfSignificantDigits( 100,SimulationDataXMLWriter.NUMBER_OF_SIGNIFICANT_DIGITS));
System.err.println("1000 --> " + toStringWithSetNumberOfSignificantDigits( 1000,SimulationDataXMLWriter.NUMBER_OF_SIGNIFICANT_DIGITS));
System.err.println("10000 --> " + toStringWithSetNumberOfSignificantDigits( 10000,SimulationDataXMLWriter.NUMBER_OF_SIGNIFICANT_DIGITS));
System.err.println("100000 --> " + toStringWithSetNumberOfSignificantDigits( 100000,SimulationDataXMLWriter.NUMBER_OF_SIGNIFICANT_DIGITS));
System.err.println("1000000 --> " + toStringWithSetNumberOfSignificantDigits( 1000000,SimulationDataXMLWriter.NUMBER_OF_SIGNIFICANT_DIGITS));
System.err.println("10000000 --> " + toStringWithSetNumberOfSignificantDigits( 10000000,SimulationDataXMLWriter.NUMBER_OF_SIGNIFICANT_DIGITS));
System.err.println("100000000 --> " + toStringWithSetNumberOfSignificantDigits( 100000000,SimulationDataXMLWriter.NUMBER_OF_SIGNIFICANT_DIGITS));
System.err.println("1000000000 --> " + toStringWithSetNumberOfSignificantDigits( 1000000000,SimulationDataXMLWriter.NUMBER_OF_SIGNIFICANT_DIGITS));
System.err.println("10000000000 --> " + toStringWithSetNumberOfSignificantDigits( 10000000000.,SimulationDataXMLWriter.NUMBER_OF_SIGNIFICANT_DIGITS));
System.err.println("\n\n");
System.err.println("1.23456789123 --> " + toStringWithSetNumberOfSignificantDigits( 1.23456789123,SimulationDataXMLWriter.NUMBER_OF_SIGNIFICANT_DIGITS));
System.err.println("1.2345678912 --> " + toStringWithSetNumberOfSignificantDigits( 1.2345678912,SimulationDataXMLWriter.NUMBER_OF_SIGNIFICANT_DIGITS));
System.err.println("1.234567891 --> " + toStringWithSetNumberOfSignificantDigits( 1.234567891,SimulationDataXMLWriter.NUMBER_OF_SIGNIFICANT_DIGITS));
System.err.println("1.23456789 --> " + toStringWithSetNumberOfSignificantDigits( 1.23456789,SimulationDataXMLWriter.NUMBER_OF_SIGNIFICANT_DIGITS));
System.err.println("1.2345678 --> " + toStringWithSetNumberOfSignificantDigits( 1.2345678,SimulationDataXMLWriter.NUMBER_OF_SIGNIFICANT_DIGITS));
System.err.println("1.234567 --> " + toStringWithSetNumberOfSignificantDigits( 1.234567,SimulationDataXMLWriter.NUMBER_OF_SIGNIFICANT_DIGITS));
System.err.println("1.23456 --> " + toStringWithSetNumberOfSignificantDigits( 1.23456,SimulationDataXMLWriter.NUMBER_OF_SIGNIFICANT_DIGITS));
System.err.println("1.2345 --> " + toStringWithSetNumberOfSignificantDigits( 1.2345,SimulationDataXMLWriter.NUMBER_OF_SIGNIFICANT_DIGITS));
System.err.println("1.234 --> " + toStringWithSetNumberOfSignificantDigits( 1.234,SimulationDataXMLWriter.NUMBER_OF_SIGNIFICANT_DIGITS));
System.err.println("1.23 --> " + toStringWithSetNumberOfSignificantDigits( 1.23,SimulationDataXMLWriter.NUMBER_OF_SIGNIFICANT_DIGITS));
System.err.println("1.2 --> " + toStringWithSetNumberOfSignificantDigits( 1.2,SimulationDataXMLWriter.NUMBER_OF_SIGNIFICANT_DIGITS));
System.err.println("1.23456789123 --> " + toStringWithSetNumberOfSignificantDigits( 1.23456789123,SimulationDataXMLWriter.NUMBER_OF_SIGNIFICANT_DIGITS));
System.err.println("12.3456789123 --> " + toStringWithSetNumberOfSignificantDigits( 12.3456789123,SimulationDataXMLWriter.NUMBER_OF_SIGNIFICANT_DIGITS));
System.err.println("123.456789123 --> " + toStringWithSetNumberOfSignificantDigits( 123.456789123,SimulationDataXMLWriter.NUMBER_OF_SIGNIFICANT_DIGITS));
System.err.println("1234.56789123 --> " + toStringWithSetNumberOfSignificantDigits( 1234.56789123,SimulationDataXMLWriter.NUMBER_OF_SIGNIFICANT_DIGITS));
System.err.println("12345.6789123 --> " + toStringWithSetNumberOfSignificantDigits( 12345.6789123,SimulationDataXMLWriter.NUMBER_OF_SIGNIFICANT_DIGITS));
System.err.println("123456.789123 --> " + toStringWithSetNumberOfSignificantDigits( 123456.789123,SimulationDataXMLWriter.NUMBER_OF_SIGNIFICANT_DIGITS));
System.err.println("1234567.89123 --> " + toStringWithSetNumberOfSignificantDigits( 1234567.89123,SimulationDataXMLWriter.NUMBER_OF_SIGNIFICANT_DIGITS));
System.err.println("12345678.9123 --> " + toStringWithSetNumberOfSignificantDigits( 12345678.9123,SimulationDataXMLWriter.NUMBER_OF_SIGNIFICANT_DIGITS));
System.err.println("123456789.123 --> " + toStringWithSetNumberOfSignificantDigits( 123456789.123,SimulationDataXMLWriter.NUMBER_OF_SIGNIFICANT_DIGITS));
System.err.println("1234567891.23 --> " + toStringWithSetNumberOfSignificantDigits( 1234567891.23,SimulationDataXMLWriter.NUMBER_OF_SIGNIFICANT_DIGITS));
System.err.println("12345678912.3 --> " + toStringWithSetNumberOfSignificantDigits( 12345678912.3,SimulationDataXMLWriter.NUMBER_OF_SIGNIFICANT_DIGITS));
System.err.println("\n");
System.err.println("-1.E-323/10.0 --> " + toStringWithSetNumberOfSignificantDigits(-1.E-323/10.0,SimulationDataXMLWriter.NUMBER_OF_SIGNIFICANT_DIGITS));
System.err.println("+1.E-323/10.0 --> " + toStringWithSetNumberOfSignificantDigits(+1.E-323/10.0,SimulationDataXMLWriter.NUMBER_OF_SIGNIFICANT_DIGITS));
System.err.println("-1.E-323 --> " + toStringWithSetNumberOfSignificantDigits(-1.E-323,SimulationDataXMLWriter.NUMBER_OF_SIGNIFICANT_DIGITS));
System.err.println("+1.E-323 --> " + toStringWithSetNumberOfSignificantDigits(+1.E-323,SimulationDataXMLWriter.NUMBER_OF_SIGNIFICANT_DIGITS));
System.err.println("-1.E-33 --> " + toStringWithSetNumberOfSignificantDigits(-1.E-33,SimulationDataXMLWriter.NUMBER_OF_SIGNIFICANT_DIGITS));
System.err.println("+1.E-33 --> " + toStringWithSetNumberOfSignificantDigits(+1.E-33,SimulationDataXMLWriter.NUMBER_OF_SIGNIFICANT_DIGITS));
System.err.println("-1.E-3 --> " + toStringWithSetNumberOfSignificantDigits(-1.E-3,SimulationDataXMLWriter.NUMBER_OF_SIGNIFICANT_DIGITS));
System.err.println("+1.E-3 --> " + toStringWithSetNumberOfSignificantDigits(+1.E-3,SimulationDataXMLWriter.NUMBER_OF_SIGNIFICANT_DIGITS));
System.err.println("-0.0000 --> " + toStringWithSetNumberOfSignificantDigits(-0.0000,SimulationDataXMLWriter.NUMBER_OF_SIGNIFICANT_DIGITS));
System.err.println("+0.0000 --> " + toStringWithSetNumberOfSignificantDigits(+0.0000,SimulationDataXMLWriter.NUMBER_OF_SIGNIFICANT_DIGITS));
}
}