* <tr class="TableRowColor"><td>Right[$]</td><td>Y</td></tr>
* <tr class="TableRowColor"><td>Space[$]</td><td>Y</td></tr>
* <tr class="TableRowColor"><td>StrComp</td><td>Y</td></tr>
- * <tr class="TableRowColor"><td>StrConv</td><td></td></tr>
+ * <tr class="TableRowColor"><td>StrConv[$]</td><td>Partial</td></tr>
* <tr class="TableRowColor"><td>String[$]</td><td>Y</td></tr>
* <tr class="TableRowColor"><td>StrReverse</td><td>Y</td></tr>
* <tr class="TableRowColor"><td>UCase[$]</td><td>Y</td></tr>
import com.healthmarketscience.jackcess.expr.Function;
import com.healthmarketscience.jackcess.expr.LocaleContext;
import com.healthmarketscience.jackcess.expr.Value;
+import org.apache.commons.lang.WordUtils;
import static com.healthmarketscience.jackcess.impl.expr.DefaultFunctions.*;
import static com.healthmarketscience.jackcess.impl.expr.FunctionSupport.*;
*/
public class DefaultTextFunctions
{
+ // mask to separate the case conversion value (first two bits) from the char
+ // conversion value for the StrConv() function
+ private static final int STR_CONV_MASK = 0x03;
private DefaultTextFunctions() {}
}
});
+ public static final Function STRCONV = registerStringFunc(new FuncVar("StrConv", 2, 3) {
+ @Override
+ protected Value evalVar(EvalContext ctx, Value[] params) {
+ Value param1 = params[0];
+ if(param1.isNull()) {
+ return ValueSupport.NULL_VAL;
+ }
+
+ String str = param1.getAsString(ctx);
+ int conversion = params[1].getAsLongInt(ctx);
+ // TODO, for now, ignore locale id...?
+ // int localeId = params[2];
+
+ int caseConv = STR_CONV_MASK & conversion;
+ int charConv = (~STR_CONV_MASK) & conversion;
+
+ switch(caseConv) {
+ case 1:
+ // vbUpperCase
+ str = str.toUpperCase();
+ break;
+ case 2:
+ // vbLowerCase
+ str = str.toLowerCase();
+ break;
+ case 3:
+ // vbProperCase
+ str = WordUtils.capitalize(str.toLowerCase());
+ break;
+ default:
+ // do nothing
+ }
+
+ if(charConv != 0) {
+ // 64 = vbUnicode, all java strings are already unicode,so nothing to do
+ if(charConv != 64) {
+ throw new EvalException("Unsupported character conversion " + charConv);
+ }
+ }
+
+ return ValueSupport.toValue(str);
+ }
+ });
+
public static final Function STRING = registerStringFunc(new Func2("String") {
@Override
protected Value eval2(EvalContext ctx, Value param1, Value param2) {
}
public static DateFormat getDateFormatForType(LocaleContext ctx, Value.Type type) {
- String fmtStr = null;
- switch(type) {
- case DATE:
- fmtStr = ctx.getTemporalConfig().getDefaultDateFormat();
- break;
- case TIME:
- fmtStr = ctx.getTemporalConfig().getDefaultTimeFormat();
- break;
- case DATE_TIME:
- fmtStr = ctx.getTemporalConfig().getDefaultDateTimeFormat();
- break;
- default:
- throw new EvalException("Unexpected date/time type " + type);
- }
- return ctx.createDateFormat(fmtStr);
+ String fmtStr = null;
+ switch(type) {
+ case DATE:
+ fmtStr = ctx.getTemporalConfig().getDefaultDateFormat();
+ break;
+ case TIME:
+ fmtStr = ctx.getTemporalConfig().getDefaultTimeFormat();
+ break;
+ case DATE_TIME:
+ fmtStr = ctx.getTemporalConfig().getDefaultDateTimeFormat();
+ break;
+ default:
+ throw new EvalException("Unexpected date/time type " + type);
+ }
+ return ctx.createDateFormat(fmtStr);
}
/**
assertEquals(1, eval("=StrComp('bar', 'FOO', 0)"));
assertEquals(-1, eval("=StrComp('FOO', 'foo', 0)"));
+ assertEquals("FOO", eval("=StrConv('foo', 1)"));
+ assertEquals("foo", eval("=StrConv('foo', 2)"));
+ assertEquals("foo", eval("=StrConv('FOO', 2)"));
+ assertEquals("Foo Bar", eval("=StrConv('FOO bar', 3)"));
+
assertEquals("halb", eval("=StrReverse('blah')"));
assertEquals("foo", eval("=Choose(1,'foo','bar','blah')"));
assertEquals(new Date(1044680400000L), eval("=#01/02/2003# + '37'"));
assertEquals(new Date(1044680400000L), eval("='37' + #01/02/2003#"));
assertEquals(new Date(1041508800000L), eval("=#01/02/2003 7:00:00 AM#"));
+
+ assertEquals("2/8/2003", eval("=CStr(#01/02/2003# + '37')"));
+ assertEquals("9:24:00 AM", eval("=CStr(#7:00:00 AM# + 0.1)"));
+ assertEquals("1/2/2003 1:10:00 PM", eval("=CStr(#01/02/2003# + #13:10:00#)"));
}
public void testNull() throws Exception