package com.meidusa.amoeba.parser.function; import java.util.List; import com.meidusa.amoeba.parser.expression.Expression; import com.meidusa.amoeba.sqljep.ParseException; /** * @author struct */ public class Substring extends AbstractFunction { @SuppressWarnings("unchecked") public Comparable evaluate(List<Expression> list, Object[] parameters) throws ParseException { int size = list.size(); if(size<2){ return null; } String str = (String)list.get(0).evaluate(parameters); if(str == null){ return null; } int start = ((Long)list.get(1).evaluate(parameters)).intValue(); if(size == 2){ return substring(str,start,-1); }else if(size == 3){ int length = ((Long)list.get(1).evaluate(parameters)).intValue(); if(length<=0) return ""; return substring(str,start,length); }else{ return null; } } /** * pos * @param str * @param pos 第几个位置开始(从1开始) * @param length 子字符串长度 * @return */ public static String substring(String str,int pos,int length){ if(pos==0){ return ""; } int beginIndex = 0; if(pos<0){ beginIndex = str.length() + pos; if(beginIndex <0)return ""; }else{ beginIndex = pos -1; } if(length <=-1){ return str.substring(beginIndex); }else{ int endIndex = beginIndex+length>str.length()-1?str.length():beginIndex+length; return str.substring(beginIndex, endIndex); } } public static void main(String[] args){ System.out.println(substring("Sakila",-3,-2)); } }