package com.saye.hrs.commons.string;

import java.io.UnsupportedEncodingException;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;
import java.util.Random;
import java.util.regex.Pattern;

public class StringDUtil {

	/**
	 * 去掉给定字符串前和后的空格，返回干净的字符串
	 * @param str
	 * @return String
	 */
	public static String removeSpaces(Object args) {
		
		String argsStr = changeNullToEmpty(args);
		if(args!=null){
			args = argsStr.trim();
			while (argsStr.startsWith(" ")) {
				argsStr = argsStr.substring(1, argsStr.length()).trim();
			}
			while (argsStr.endsWith(" ")) {
				argsStr = argsStr.substring(0, argsStr.length() - 1).trim();
			}
		}else{
			argsStr = "";
		}
		
		return argsStr;
	}


	/**
	 * 转全角的函数
	 * @param str
	 * @return String
	 */
	public static String toSBC(String input) { 
		//半角转全角： 
		char[] c = input.toCharArray(); 
		for (int i = 0; i < c.length; i++) { 
			if (c[i] == 32) { 
				c[i] = (char) 12288; 
				continue; 
			} 
			if (c[i] < 127) {
				c[i] = (char) (c[i] + 65248);
			}
		} 
		return new String(c); 
	} 


	/**
	 * 转半角的函数
	 * @param str
	 * @return String
	 */
	public static String toDBC(String input) { 
		char[] c = input.toCharArray();
		for (int i = 0; i < c.length; i++) { 
			if (c[i] == 12288) { 
				c[i] = (char) 32; 
				continue; 
        } 
			if (c[i] > 65280 && c[i] < 65375){
				c[i] = (char) (c[i] - 65248);
			}
		} 
		return new String(c); 
	}
	
	
	/**
	 * 为每添加一个元素前面增加指定的分隔 除第一个元素之外
	 * @param str
	 * @param appStr
	 * @param compart
	 * @return
	 */
	public static StringBuffer appendElement(StringBuffer strB,String appStr,String compart){
		
		//当出入参数为NULL时
		if(strB == null){
			return new StringBuffer(appStr);
		}
		
		//当没有元素时直接添加追加元素 否则先添加分隔符
		if(strB.length() == 0){
			strB.append(appStr);
		}else{
			strB.append(compart);
			strB.append(appStr);
		}
		
		return strB;
	}
	
	
	/**
	 * 移除元素
	 * @param str
	 * @param moveStr
	 * @param compart
	 * @return
	 */
	public static StringBuffer moveElement(StringBuffer strB,String moveStr,String compart){
		
		//当出入参数为NULL时
		if(strB == null){
			return strB;
		}
		
		StringBuffer newStrB = new StringBuffer();
		
		String[] strArray = strB.toString().split(compart);
		for(int i=0;i<strArray.length;i++){
			
			if(moveStr.equals(strArray[i])){
				continue;
			}
			
			if(i == 0){
				newStrB.append(strArray[i]);
			}else{
				newStrB.append(compart);
				newStrB.append(strArray[i]);
			}
		}
		
		
		
		return newStrB;
	}
	
	
	/**
	 * 移除第一个匹配的元素
	 * @param str
	 * @param moveStr
	 * @param compart
	 * @return
	 */
	public static StringBuffer moveFirstElement(StringBuffer strB,String moveStr,String compart){
		
		//当出入参数为NULL时
		if(strB == null){
			return strB;
		}
		
		StringBuffer newStrB = new StringBuffer();
		
		String[] strArray = strB.toString().split(compart);
		boolean tag = false;
		for(int i=0;i<strArray.length;i++){
			
			if(moveStr.equals(strArray[i]) == true && tag == false){
				tag = true;
				continue;
			}
			
			if(i == 0){
				newStrB.append(strArray[i]);
			}else{
				newStrB.append(compart);
				newStrB.append(strArray[i]);
			}
		}
		
		
		
		return newStrB;
	}
	
	
	/**
	 * 从给定字符中 返回所含的中文字符 并按每组以以字符串数组的形式返回
	 * @param src
	 * @return
	 */
	public static String[] getChinese(String src){
		
		List list = new ArrayList();
		
		byte[] srcByte = src.getBytes();
		int srcLength = srcByte.length;
		
		
		int begin = -1;
		int end = -1;
		
		for(int i=0;i<srcLength;i++){
			
			//设置中文的开始位
			if(srcByte[i] < 0 && begin == -1){
				begin = i;
			}
			
			//设置中文的结束位
			if(srcByte[i] > 0 && begin != -1 && end == -1){
				end = i;
			}
			
			
			//如果已经找到中文的开始 但直到最后也没找到中文的结束，则将字符的结束位当成中文的截止位
			if(begin != -1 && i == srcLength - 1){
				end = i;
			}
			
			
			//将中文提取出来
			if(begin != -1 && end != -1){
				
				
				int tempLength = end-begin+1;
				if(tempLength % 2 != 0){
					tempLength = tempLength - 1;
				}
				
				
				byte[] tempByte = new byte[tempLength];
				System.arraycopy(srcByte,  begin,  tempByte,  0,  tempLength);  
				
				list.add(new String(tempByte));
				
				begin = -1;
				end = -1;
			}
			
		}
		
		
		//将中文以数组输出
		int size = list.size();
		String[] chineseArray = new String[size];
		for(int i=0;i<size;i++){
			chineseArray[i] = list.get(i).toString();
		}
		
		return chineseArray;
	}
	
	/**
	 * 产生指定长度的随机码（由字母和数字组成）
	 * @param len
	 * @return
	 */
	public static String generateRandomCodeForLength(int len){
		
		String s = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789"; 
		StringBuffer sRand = new StringBuffer();

		Random random=new Random();
		
		for (int i = 0; i < len; i++) {
			
			String ch = String.valueOf(s.charAt(random.nextInt(s.length())));
			sRand.append(ch);
		}
		return sRand.toString();
	}
	
	/**
	 * 将字符串NULL转换为空:""
	 * @param args
	 * @return
	 */
	public static String changeNullToEmpty(Object args) {
		
		String result = null == args ? "" : String.valueOf(args);
		if("\"null\"".equals(result) || "null".equals(result)){
			result = "";
		}
		return result;
	}
	
	/**
	 * 将字符串NULL转换为空:""，并且去字符串中的转义字符
	 * @param args
	 * @return
	 */
	public static String changeNullToEmptyReplaceEscape(Object args) {
		
		String result = null == args ? "" : String.valueOf(args);
		result = result.replaceAll("'", "");
		result = result.replaceAll("｛", "{");
		result = result.replaceAll("｝", "}");
		return result;
	}
	
	/**
	 * 验证字符串是否为空：NULL或""
	 * @param str
	 * @return 返回值为true，说明是为空。
	 */
	public static Boolean isEmpty(Object args) {
		
		String result = "";
		String str = changeNullToEmpty(args);

		if("".equals(removeSpaces(str)) || "\"null\"".equals(removeSpaces(str)) || "null".equals(removeSpaces(str))){
			
			return true;
		}
		return false;
	}
	
	/**
	 * 验证MAP中要验证的字段是否为空：NULL或""
	 * @param hm 要验证的MAP
	 * @param fieldString 传入方式(以,将字段进行分割)，如：personid,sysid
	 * @return 返回值为空，则验证成功，说明都不为空；否则返回为空的该字段名。
	 */
	public static String isExistEmpty(Map<Object, Object> hm, String fieldString) {

		String[] strArr = fieldString.split(",");
		for (int i = 0; i < strArr.length; i++) {
			
			String key = strArr[i];
			Object obj = hm.get(key);
			if(isEmpty(obj)){
				
				return key;
			}
		}		
		
		return "";
	}
	
	/**
	 * 判断字符串是否为正整数
	 * @param str
	 * @return
	 */
	public static boolean isPositiveInteger (String str){ 
	    Pattern pattern = Pattern.compile("^[0-9]*[1-9][0-9]*$"); 
	    return pattern.matcher(str).matches();    
	} 
	
	/**
	 * 判断字符串是否为正整数或正浮点数
	 * @param str
	 * @return
	 */
	public static boolean isPositiveIntegerOrPositiveFloat (String str){ 
	    Pattern pattern = Pattern.compile("^(([0-9]+\\.[0-9]*[1-9][0-9]*)|([0-9]*[1-9][0-9]*\\.[0-9]+)|([0-9]*[1-9][0-9]*))$"); 
	    return pattern.matcher(str).matches();    
	}
	 
    /**
     * 
     * @description 截取字符串
     * @author mczheng       
     * @created 2016-6-25 下午6:13:29 
     * @param str 要截取的字符串
     * @param maxLength 字符长度，英文字符算0.5个长度，当截取剩下最后一位是0.5个长度而最后一个字符是中文时，则舍弃掉。
     * @return
     */
	public static String substring(String str, int maxLength) {
		if (!hasLength(str))
			return str;

		int subSLength = maxLength * 2;
		int tempSubLength = subSLength;//截取字符数
		String subStr = "";
		try {
			int strLen = str.getBytes("GBK").length;
			if (strLen <= subSLength) return str;
			subStr = str.substring(0, str.length() < subSLength ? str.length() : subSLength); //截取的子串
			int subStrByetsL = subStr.getBytes("GBK").length; //截取子串的字节长度
			//说明截取的字符串中包含有汉字
			while (subStrByetsL > tempSubLength) {
				int subSLengthTemp = --subSLength;
				subStr = str.substring(0, subSLengthTemp > str.length() ? str.length() : subSLengthTemp);
				subStrByetsL = subStr.getBytes("GBK").length;
			}
			subStr += "...";
		} catch (UnsupportedEncodingException e) {
			e.printStackTrace();
		}
		return subStr;
	}

	public static boolean hasLength(String str) {
		return (str != null) && (str.length() > 0);
	}
	
	public static void main(String[] args) {
//		
//		StringBuffer str = new StringBuffer("a,c,d,c");
//		str = StringDUtil.moveFirstElement(str, "c", ",");
//		System.out.println(str.toString());
//		
//		System.out.println(isEmpty("\"null\""));
		System.out.println("11111111111");
		System.out.println(StringDUtil.substring("一二三四五六七八九十一二三四五六七八九十一二三四五六七八九十", 15));
	}

	/**
	 * @description 判断字符串是否有值且值不为空格
	 * @author thuang       
	 * @created 2020年1月7日 下午1:09:49 
	 * @param str
	 * @return
	 */
	public static boolean isNotBlank(String str) {
		if (str != null && str.length() > 0 && str.trim().length() > 0) {
			return true;
		}
		return false;
	}

}
