Store grouping separator in integer preference and remove boolean from Engine
This commit is contained in:
@@ -1,32 +1,42 @@
|
||||
package jscl;
|
||||
|
||||
import jscl.math.Expression;
|
||||
import jscl.math.Generic;
|
||||
import jscl.math.NotIntegerException;
|
||||
import jscl.math.function.*;
|
||||
import jscl.math.operator.Operator;
|
||||
import jscl.math.operator.Percent;
|
||||
import jscl.math.operator.Rand;
|
||||
import jscl.math.operator.matrix.OperatorsRegistry;
|
||||
import jscl.text.ParseException;
|
||||
import org.solovyev.common.NumberFormatter;
|
||||
import org.solovyev.common.math.MathRegistry;
|
||||
import org.solovyev.common.msg.MessageRegistry;
|
||||
import org.solovyev.common.msg.Messages;
|
||||
|
||||
import javax.annotation.Nonnull;
|
||||
import javax.annotation.Nullable;
|
||||
import java.math.BigDecimal;
|
||||
import java.math.BigInteger;
|
||||
import java.util.List;
|
||||
|
||||
import static midpcalc.Real.NumberFormat.*;
|
||||
import javax.annotation.Nonnull;
|
||||
import javax.annotation.Nullable;
|
||||
|
||||
import jscl.math.Expression;
|
||||
import jscl.math.Generic;
|
||||
import jscl.math.NotIntegerException;
|
||||
import jscl.math.function.Constants;
|
||||
import jscl.math.function.ConstantsRegistry;
|
||||
import jscl.math.function.Function;
|
||||
import jscl.math.function.FunctionsRegistry;
|
||||
import jscl.math.function.IConstant;
|
||||
import jscl.math.function.PostfixFunctionsRegistry;
|
||||
import jscl.math.operator.Operator;
|
||||
import jscl.math.operator.Percent;
|
||||
import jscl.math.operator.Rand;
|
||||
import jscl.math.operator.matrix.OperatorsRegistry;
|
||||
import jscl.text.ParseException;
|
||||
|
||||
import static midpcalc.Real.NumberFormat.FSE_ENG;
|
||||
import static midpcalc.Real.NumberFormat.FSE_NONE;
|
||||
import static midpcalc.Real.NumberFormat.FSE_SCI;
|
||||
|
||||
public class JsclMathEngine implements MathEngine {
|
||||
|
||||
public static final AngleUnit DEFAULT_ANGLE_UNITS = AngleUnit.deg;
|
||||
public static final NumeralBase DEFAULT_NUMERAL_BASE = NumeralBase.dec;
|
||||
public static final char GROUPING_SEPARATOR_DEFAULT = ' ';
|
||||
public static final char GROUPING_SEPARATOR_NO = 0;
|
||||
public static final int MAX_FRACTION_DIGITS = 20;
|
||||
@Nonnull
|
||||
private static JsclMathEngine instance = new JsclMathEngine();
|
||||
@@ -39,11 +49,10 @@ public class JsclMathEngine implements MathEngine {
|
||||
return new NumberFormatter();
|
||||
}
|
||||
};
|
||||
private char groupingSeparator = GROUPING_SEPARATOR_DEFAULT;
|
||||
private char groupingSeparator = GROUPING_SEPARATOR_NO;
|
||||
private boolean roundResult = false;
|
||||
private int numberFormat = FSE_NONE;
|
||||
private int precision = 5;
|
||||
private boolean useGroupingSeparator = false;
|
||||
@Nonnull
|
||||
private AngleUnit angleUnits = DEFAULT_ANGLE_UNITS;
|
||||
@Nonnull
|
||||
@@ -172,7 +181,7 @@ public class JsclMathEngine implements MathEngine {
|
||||
|
||||
private NumberFormatter prepareNumberFormatter(@Nonnull NumeralBase nb) {
|
||||
final NumberFormatter nf = numberFormatter.get();
|
||||
nf.setGroupingSeparator(useGroupingSeparator ? getGroupingSeparatorChar(nb) : NumberFormatter.NO_GROUPING);
|
||||
nf.setGroupingSeparator(hasGroupingSeparator() ? getGroupingSeparatorChar(nb) : NumberFormatter.NO_GROUPING);
|
||||
nf.setPrecision(roundResult ? precision : NumberFormatter.NO_ROUNDING);
|
||||
switch (numberFormat) {
|
||||
case FSE_ENG:
|
||||
@@ -272,7 +281,7 @@ public class JsclMathEngine implements MathEngine {
|
||||
|
||||
@Nonnull
|
||||
public String addGroupingSeparators(@Nonnull NumeralBase nb, @Nonnull String ungroupedDoubleValue) {
|
||||
if (useGroupingSeparator) {
|
||||
if (hasGroupingSeparator()) {
|
||||
final String groupingSeparator = getGroupingSeparator(nb);
|
||||
|
||||
final int dotIndex = ungroupedDoubleValue.indexOf(".");
|
||||
@@ -299,6 +308,10 @@ public class JsclMathEngine implements MathEngine {
|
||||
}
|
||||
}
|
||||
|
||||
private boolean hasGroupingSeparator() {
|
||||
return groupingSeparator != JsclMathEngine.GROUPING_SEPARATOR_NO;
|
||||
}
|
||||
|
||||
@Nonnull
|
||||
private String getGroupingSeparator(@Nonnull NumeralBase nb) {
|
||||
return nb == NumeralBase.dec ? String.valueOf(groupingSeparator) : " ";
|
||||
@@ -342,10 +355,6 @@ public class JsclMathEngine implements MathEngine {
|
||||
this.precision = precision;
|
||||
}
|
||||
|
||||
public void setUseGroupingSeparator(boolean useGroupingSeparator) {
|
||||
this.useGroupingSeparator = useGroupingSeparator;
|
||||
}
|
||||
|
||||
public void setScienceNotation(boolean scienceNotation) {
|
||||
setNumberFormat(scienceNotation ? FSE_SCI : FSE_NONE);
|
||||
}
|
||||
@@ -361,7 +370,7 @@ public class JsclMathEngine implements MathEngine {
|
||||
return this.groupingSeparator;
|
||||
}
|
||||
|
||||
public void setGroupingSeparator(char groupingSeparator) {
|
||||
this.groupingSeparator = groupingSeparator;
|
||||
public void setGroupingSeparator(char separator) {
|
||||
this.groupingSeparator = separator;
|
||||
}
|
||||
}
|
||||
|
@@ -1,12 +1,14 @@
|
||||
package jscl;
|
||||
|
||||
import org.solovyev.common.math.MathRegistry;
|
||||
|
||||
import java.math.BigInteger;
|
||||
|
||||
import javax.annotation.Nonnull;
|
||||
|
||||
import jscl.math.function.Function;
|
||||
import jscl.math.function.IConstant;
|
||||
import jscl.math.operator.Operator;
|
||||
import org.solovyev.common.math.MathRegistry;
|
||||
|
||||
import javax.annotation.Nonnull;
|
||||
import java.math.BigInteger;
|
||||
|
||||
public interface MathContext {
|
||||
|
||||
@@ -40,9 +42,7 @@ public interface MathContext {
|
||||
|
||||
void setPrecision(int precision);
|
||||
|
||||
void setUseGroupingSeparator(boolean useGroupingSeparator);
|
||||
|
||||
void setGroupingSeparator(char groupingSeparator);
|
||||
void setGroupingSeparator(char separator);
|
||||
|
||||
@Nonnull
|
||||
String format(double value);
|
||||
|
@@ -1,9 +1,10 @@
|
||||
package jscl;
|
||||
|
||||
import midpcalc.Real;
|
||||
import org.junit.Before;
|
||||
import org.junit.Test;
|
||||
|
||||
import midpcalc.Real;
|
||||
|
||||
import static org.junit.Assert.assertEquals;
|
||||
|
||||
/**
|
||||
@@ -23,7 +24,7 @@ public class JsclMathEngineTest {
|
||||
@Test
|
||||
public void testFormat() throws Exception {
|
||||
try {
|
||||
me.setUseGroupingSeparator(true);
|
||||
me.setGroupingSeparator(' ');
|
||||
assertEquals("1", me.format(1d, NumeralBase.bin));
|
||||
assertEquals("10", me.format(2d, NumeralBase.bin));
|
||||
assertEquals("11", me.format(3d, NumeralBase.bin));
|
||||
@@ -60,7 +61,7 @@ public class JsclMathEngineTest {
|
||||
assertEquals("6.CCDA6A054226DB6E-19", me.format(0.00000000000000000000009d, NumeralBase.hex));
|
||||
assertEquals("A.E15D766ED03E2BEE-20", me.format(0.000000000000000000000009d, NumeralBase.hex));
|
||||
} finally {
|
||||
me.setUseGroupingSeparator(false);
|
||||
me.setGroupingSeparator(JsclMathEngine.GROUPING_SEPARATOR_NO);
|
||||
}
|
||||
|
||||
assertEquals("1", me.format(1d, NumeralBase.bin));
|
||||
@@ -93,7 +94,6 @@ public class JsclMathEngineTest {
|
||||
@Test
|
||||
public void testBinShouldAlwaysUseSpaceAsGroupingSeparator() throws Exception {
|
||||
me.setGroupingSeparator('\'');
|
||||
me.setUseGroupingSeparator(true);
|
||||
|
||||
assertEquals("100 0000 0000", me.format(1024d, NumeralBase.bin));
|
||||
}
|
||||
@@ -101,7 +101,6 @@ public class JsclMathEngineTest {
|
||||
@Test
|
||||
public void testHexShouldAlwaysUseSpaceAsGroupingSeparator() throws Exception {
|
||||
me.setGroupingSeparator('\'');
|
||||
me.setUseGroupingSeparator(true);
|
||||
|
||||
assertEquals("4 00", me.format(1024d, NumeralBase.hex));
|
||||
}
|
||||
|
@@ -1,5 +1,18 @@
|
||||
package jscl.math;
|
||||
|
||||
import org.junit.Test;
|
||||
|
||||
import java.io.BufferedReader;
|
||||
import java.io.IOException;
|
||||
import java.io.InputStreamReader;
|
||||
import java.net.MalformedURLException;
|
||||
import java.net.URL;
|
||||
import java.net.URLConnection;
|
||||
import java.util.Set;
|
||||
|
||||
import javax.annotation.Nonnull;
|
||||
import javax.annotation.Nullable;
|
||||
|
||||
import jscl.AngleUnit;
|
||||
import jscl.JsclMathEngine;
|
||||
import jscl.MathEngine;
|
||||
@@ -8,19 +21,10 @@ import jscl.math.function.Constant;
|
||||
import jscl.math.function.ExtendedConstant;
|
||||
import jscl.math.function.IConstant;
|
||||
import jscl.text.ParseException;
|
||||
import org.junit.Test;
|
||||
|
||||
import javax.annotation.Nonnull;
|
||||
import javax.annotation.Nullable;
|
||||
import java.io.BufferedReader;
|
||||
import java.io.IOException;
|
||||
import java.io.InputStreamReader;
|
||||
import java.net.MalformedURLException;
|
||||
import java.net.URL;
|
||||
import java.net.URLConnection;
|
||||
import java.util.Set;
|
||||
|
||||
import static org.junit.Assert.*;
|
||||
import static org.junit.Assert.assertEquals;
|
||||
import static org.junit.Assert.assertTrue;
|
||||
import static org.junit.Assert.fail;
|
||||
|
||||
public class ExpressionTest {
|
||||
|
||||
@@ -786,7 +790,7 @@ public class ExpressionTest {
|
||||
public void testFormat() throws Exception {
|
||||
final JsclMathEngine me = JsclMathEngine.getInstance();
|
||||
try {
|
||||
me.setUseGroupingSeparator(true);
|
||||
me.setGroupingSeparator(' ');
|
||||
assertEquals("123 456.7891011", Expression.valueOf("123456.7891011").numeric().toString());
|
||||
assertEquals("123 456.7891011", Expression.valueOf("123456.7891011").simplify().toString());
|
||||
assertEquals("123 456.7891011123", Expression.valueOf("123456.7891011123123123123123").simplify().toString());
|
||||
@@ -831,7 +835,7 @@ public class ExpressionTest {
|
||||
assertEquals("0.3333333333", Expression.valueOf("1/3").numeric().toString());
|
||||
|
||||
} finally {
|
||||
me.setUseGroupingSeparator(false);
|
||||
me.setGroupingSeparator(JsclMathEngine.GROUPING_SEPARATOR_NO);
|
||||
me.setScienceNotation(false);
|
||||
me.setRoundResult(false);
|
||||
}
|
||||
|
Reference in New Issue
Block a user