Browse Source

more tests, more bug fixes for custom formats

git-svn-id: https://svn.code.sf.net/p/jackcess/code/jackcess/branches/jdk8@1270 f203690c-595d-4dc9-a70b-905162fa7fd2
tags/jackcess-3.0.0
James Ahlborn 5 years ago
parent
commit
229464aff2

+ 14
- 6
src/main/java/com/healthmarketscience/jackcess/impl/expr/FormatUtil.java View File

@@ -936,7 +936,6 @@ public class FormatUtil
private static Fmt parseCustomTextFormat(ExprBuf buf, Args args) {

Fmt fmt = null;
Fmt emptyFmt = null;

List<BiConsumer<StringBuilder,CharSource>> subFmts = new ArrayList<>();
int numPlaceholders = 0;
@@ -1037,11 +1036,12 @@ public class FormatUtil

flushPendingTextLiteral(pendingLiteral, subFmts);

Fmt emptyFmt = null;
if(fmt == null) {
fmt = new CharSourceFmt(subFmts, numPlaceholders, rightAligned,
textCase);
emptyFmt = NULL_FMT;
} else if(emptyFmt == null) {
} else {
emptyFmt = (hasFmtChars ?
new CharSourceFmt(subFmts, numPlaceholders, rightAligned,
textCase) :
@@ -1438,10 +1438,18 @@ public class FormatUtil
private Value formatMaybeZero(BigDecimal bd, NumberFormat fmt) {
// in theory we want to use the given format. however, if, due to
// rounding, we end up with a number equivalent to zero, then we fall
// back to the zero format
int maxDecDigits = fmt.getMaximumFractionDigits();
if(maxDecDigits < bd.scale()) {
bd = bd.setScale(maxDecDigits, NumberFormatter.ROUND_MODE);
// back to the zero format. if we are using scientific notation,
// however, then don't worry about this
if(!(fmt instanceof NumberFormatter.ScientificFormat)) {
int maxDecDigits = fmt.getMaximumFractionDigits();
int mult = ((DecimalFormat)fmt).getMultiplier();
while(mult > 1) {
++maxDecDigits;
mult /= 10;
}
if(maxDecDigits < bd.scale()) {
bd = bd.setScale(maxDecDigits, NumberFormatter.ROUND_MODE);
}
}
if(BigDecimal.ZERO.compareTo(bd) == 0) {
// fall back to zero format

+ 41
- 9
src/test/java/com/healthmarketscience/jackcess/impl/expr/DefaultFunctionsTest.java View File

@@ -347,6 +347,8 @@ public class DefaultFunctionsTest extends TestCase
"=Format('3.9', '*~dddd, yy mmm d, hh:nn:ss \\Y[Yellow]')");
assertEval("Tuesday, 00 Jan 01/2, 09:36:00 PM",
"=Format('3.9', 'dddd, yy mmm mm/d, hh:nn:ss AMPM')");
assertEval("9:36:00 PM",
"=Format('3.9', 'ttttt')");
assertEval("foo",
"=Format('foo', 'dddd, yy mmm mm d, hh:nn:ss AMPM')");

@@ -390,24 +392,46 @@ public class DefaultFunctionsTest extends TestCase
"", "''",
"", "Null");

assertEvalFormat("'\"p\"#.00#\"blah\";(\"p\"#.00#\"blah\");\"zero\";\"yuck\"'",
assertEvalFormat("'\\p#.00#\"blah\";*~(\"p\"#.00#\"blah\");\"zero\";\"yuck\"'",
"p13.00blah", "13",
"(p13.00blah)", "-13",
"zero", "0",
"", "''",
"yuck", "Null");

assertEvalFormat("'0.##;(0.###);\"zero\";\"yuck\"'",
assertEvalFormat("'0.##;(0.###);\"zero\";\"yuck\";'",
"0.03", "0.03",
"zero", "0.003",
"(0.003)", "-0.003",
"zero", "-0.0003");

// FIXME, need to handle rounding w/ negatives
// FIXME, need to handle dangling decimal
// assertEvalFormat("'0.##;(0.###E+0)'",
// "0.03", "0.03",
// "(0.003)", "-0.0003",
assertEvalFormat("'0.##;(0.###E+0)'",
"0.03", "0.03",
"(3.E-4)", "-0.0003",
"0.", "0",
"34223.", "34223",
"(3.422E+4)", "-34223");

assertEvalFormat("'0.###E-0'",
"3.E-4", "0.0003",
"3.422E4", "34223"
);

assertEvalFormat("'0.###e+0'",
"3.e-4", "0.0003",
"3.422e+4", "34223"
);

assertEvalFormat("'0.###e-0'",
"3.e-4", "0.0003",
"3.422e4", "34223"
);

assertEvalFormat("'#,##0.###'",
"0.003", "0.003",
"0.", "0.0003",
"34,223.", "34223"
);

assertEvalFormat("'0.'",
"13.", "13",
@@ -434,6 +458,14 @@ public class DefaultFunctionsTest extends TestCase
"0", "0"
);

assertEvalFormat("'%0'",
"%13", "0.13",
"%0", "0.003",
"-%45", "-0.45",
"%0", "-0.003",
"%0", "0"
);

assertEvalFormat("'#'",
"13", "13",
"0", "0.003",
@@ -467,14 +499,14 @@ public class DefaultFunctionsTest extends TestCase
"", "''",
"", "Null");

assertEvalFormat("'!>@'",
assertEvalFormat("'!>@;'",
"O", "'foo'",
"3", "-13",
"0", "0",
"", "''",
"", "Null");

assertEvalFormat("'!>@[Red];\"empty\"'",
assertEvalFormat("'!>*~@[Red];\"empty\";'",
"O", "'foo'",
"3", "-13",
"0", "0",

Loading…
Cancel
Save