All Downloads are FREE. Search and download functionalities are using the official Maven repository.

com.dao.support.util.StringUtil Maven / Gradle / Ivy

The newest version!
package com.dao.support.util;

import java.io.BufferedReader;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.PrintWriter;
import java.io.StringWriter;
import java.io.UnsupportedEncodingException;
import java.io.Writer;
import java.net.URLDecoder;
import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException;
import java.text.DecimalFormat;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.List;
import java.util.Random;
import java.util.regex.Matcher;
import java.util.regex.Pattern;

import javax.servlet.http.HttpServletRequest;





/**
 * 字串工具类
 * @author jianghongyan
 * @version v1.0
 * @since v1.0
 * 2017年3月6日 下午4:17:34
 */
public class StringUtil {

	/**
	 * 将一个Double转为int的String,将省略小数点后面的值
	 * 
	 * @param d double类型数据
	 * @return String
	 */
	public static String doubleToIntString(Double d) {
		int value = ((Double) d).intValue();
		return String.valueOf(value);
	}

	/**
	 * 检查浮点数
	 * 
	 * @param num 待检查数字
	 * @param type
	 *            "0+":非负浮点数 "+":正浮点数 "-0":非正浮点数 "-":负浮点数 "":浮点数
	 * @return boolean
	 */
	public static boolean checkFloat(String num, String type) {
		String eL = "";
		if (type.equals("0+"))
			eL = "^\\d+(\\.\\d+)?$";// 非负浮点数
		else if (type.equals("+"))
			eL = "^((\\d+\\.\\d*[1-9]\\d*)|(\\d*[1-9]\\d*\\.\\d+)|(\\d*[1-9]\\d*))$";// 正浮点数
		else if (type.equals("-0"))
			eL = "^((-\\d+(\\.\\d+)?)|(0+(\\.0+)?))$";// 非正浮点数
		else if (type.equals("-"))
			eL = "^(-((\\d+\\.\\d*[1-9]\\d*)|(\\d*[1-9]\\d*\\.\\d+)|(\\d*[1-9]\\d*)))$";// 负浮点数
		else
			eL = "^(-?\\d+)(\\.\\d+)?$";// 浮点数
		Pattern p = Pattern.compile(eL);
		Matcher m = p.matcher(num);
		boolean b = m.matches();
		return b;
	}

	/**
	 * 检测某字串是否存在某数组中
	 * 
	 * @param value 待检查字符串
	 * @param array 数组
	 * @return 存在返回真,不存在返回假
	 */
	public static boolean isInArray(String value, String[] array) {
		if (array == null)
			return false;
		for (String v : array) {
			if (v.equals(value))
				return true;
		}
		return false;

	}

	public static boolean isInArray(int value, String[] array) {
		if (array == null)
			return false;
		for (String v : array) {
			if (Integer.valueOf(v).intValue() == value)
				return true;
		}
		return false;
	}

	/**
	 * 将数组成str连接成字符串
	 * 
	 * @param str 字符串
	 * @param array 数组
	 * @return string
	 */
	public static String implode(String str, Object[] array) {
		if (str == null || array == null) {
			return "";
		}
		String result = "";
		for (int i = 0; i < array.length; i++) {
			if (i == array.length - 1) {
				result += array[i].toString();
			} else {
				result += array[i].toString() + str;
			}
		}
		return result;
	}

	public static String implodeValue(String str, Object[] array) {
		if (str == null || array == null) {
			return "";
		}
		String result = "";
		for (int i = 0; i < array.length; i++) {
			if (i == array.length - 1) {
				result += "?";
			} else {
				result += "?" + str;
			}
		}
		return result;
	}

	/**
	 * MD5加密方法
	 * 
	 * @param str
	 *            String
	 * @return String
	 */
	public static String md5(String str) {
		return md5(str,true);
	}

	public static String md5(String str, boolean zero) {
		MessageDigest messageDigest = null;
		try {
			messageDigest = MessageDigest.getInstance("MD5");
		} catch (NoSuchAlgorithmException ex) {
			ex.printStackTrace();
			return null;
		}
		byte[] resultByte = messageDigest.digest(str.getBytes());
		StringBuffer result = new StringBuffer();
		for (int i = 0; i < resultByte.length; ++i) {
			int v = 0xFF & resultByte[i];
			if(v<16 && zero)
				result.append("0");
			result.append(Integer.toHexString(v));
		}
		return result.toString();
	}



	public static void main(String[] args){

		//		//System.out.println(md5.getMD5("123456".getBytes()) );
		//System.out.println( md5("123456"));
	}


	/**
	 * 验证Email地址是否有效
	 * 
	 * @param sEmail 待检查的email地址
	 * @return boolean
	 */
	public static boolean validEmail(String sEmail) {
		String pattern = "^([a-z0-9A-Z]+[-|\\.|_]?)+[a-z0-9A-Z]@([a-z0-9A-Z]+(-[a-z0-9A-Z]+)?\\.)+[a-zA-Z]{2,}$";
		return sEmail.matches(pattern);
	}

	/**
	 * 验证字符最大长度
	 * 
	 * @param str 待检查字符串
	 * @param length 长度
	 * @return boolean
	 */
	public static boolean validMaxLen(String str, int length) {
		if (str == null || str.equals("")) {
			return false;
		}
		if (str.length() > length) {
			return false;
		} else {
			return true;
		}
	}

	/**
	 * 验证字符最小长度
	 * 
	 * @param str 待检查字符串
	 * @param length 长度
	 * @return boolean
	 */
	public static boolean validMinLen(String str, int length) {
		if (str == null || str.equals("")) {
			return false;
		}
		if (str.length() < length) {
			return false;
		} else {
			return true;
		}
	}

	/**
	 * 验证一个字符串是否为空
	 * 
	 * @param str 待检查字符串
	 * @return 如果为空返回真,如果不为空返回假
	 */

	public static boolean isEmpty(String str) {
		if (str == null || "".equals(str))
			return true;

		String pattern = "\\S";
		Pattern p = Pattern.compile(pattern, 2 | Pattern.DOTALL);
		Matcher m = p.matcher(str);
		return !m.find();
	}
	
	
	/**
	 * 不为空的判断
	 * @param str 待检查字符串
	 * @return boolean
	 */
	public static boolean notEmpty(String str) {
		 return !isEmpty(str);
	}

	
	
	/**
	 * 验证两个字符串是否相等且不能为空
	 * 
	 * @param str1  待检查字符串
	 * @param str2  待检查字符串
	 * @return boolean
	 */
	public static boolean equals(String str1, String str2) {
		if (str1 == null || str1.equals("") || str2 == null || str2.equals("")) {
			return false;
		}
		return str1.equals(str2);
	}

	/**
	 * 将字串转为数字
	 * 
	 * @param str 待操作字符串
	 * @param checked 如果为treu格式不正确抛出异常
	 * @return int
	 */
	public static int toInt(String str, boolean checked) {
		int value = 0;
		if (str == null || str.equals("")) {
			return 0;
		}
		try {
			value = Integer.parseInt(str);
		} catch (Exception ex) {
			if (checked) {
				throw new RuntimeException("整型数字格式不正确");
			} else {
				return 0;
			}
		}
		return value;
	}


	/**
	 * 将object转为数字
	 * 
	 * @param obj 需要转object的对象
	 * @param checked 如果为true格式不正确抛出异常
	 * @return int
	 */
	public static int toInt(Object obj, boolean checked) {
		int value = 0;
		if (obj == null ) {
			return 0;
		}
		try {
			value = Integer.parseInt(obj.toString());
		} catch (Exception ex) {
			if (checked) {
				throw new RuntimeException("整型数字格式不正确");
			} else {
				return 0;
			}
		}
		return value;
	}
	/**
	 * 将一个字串转为int,如果无空,则返回默认值
	 * @param str 要转换的数字字串
	 * @param defaultValue 默认值 
	 * @return Integer
	 */
	public static Integer toInt(String str, Integer defaultValue) {
		Integer value = defaultValue;
		if (str == null || str.equals("")) {
			return defaultValue;
		}
		try {
			value = Integer.parseInt(str);
		} catch (Exception ex) {
			return defaultValue;
		}
		return value;
	}

	/**
	 * 将字符型转为Int型
	 * 
	 * @param str 待操作字符串
	 * @return 返回的int值
	 */
	@Deprecated
	public static int toInt(String str) {
		int value = 0;
		if (str == null || str.equals("")) {
			return 0;
		}
		try {
			value = Integer.parseInt(str);
		} catch (Exception ex) {
			value = 0;
			ex.printStackTrace();
		}
		return value;
	}

	/**
	 * 已废弃
	 * @param str 待操作字符串
	 * @return 返回值
	 */
	@Deprecated
	public static Double toDouble(String str) {
		Double value = 0d;
		if (str == null || str.equals("")) {
			return 0d;
		}
		try {
			value = Double.valueOf(str);
		} catch (Exception ex) {
			value = 0d;
			// ex.printStackTrace();
		}
		return value;
	}

	/**
	 * 将一个字串转为double
	 * 
	 * @param str 待操作字符串
	 * @param checked 如果为treu格式不正确抛出异常
	 * @return double
	 */
	public static Double toDouble(String str, boolean checked) {
		Double value = 0d;
		if (str == null || str.equals("")) {
			return 0d;
		}
		try {
			value = Double.valueOf(str);
		} catch (Exception ex) {
			if (checked)
				throw new RuntimeException("数字格式不正确");
			else
				return 0D;
		}
		return value;
	}

	/**
	 * 将一个object转为double
	 * 如果object 为 null 则返回0;
	 * 
	 * @param obj 需要转成Double的对象
	 * @param checked 如果为true格式不正确抛出异常
	 * @return double
	 */
	public static Double toDouble(Object obj, boolean checked) {
		Double value = 0d;
		if (obj == null ) {
			if (checked)
				throw new RuntimeException("数字格式不正确");
			else
				return 0D;
		}
		try {
			value = Double.valueOf(obj.toString());
		} catch (Exception ex) {
			if (checked)
				throw new RuntimeException("数字格式不正确");
			else
				return 0D;
		}
		return value;
	}

	/**
	 * 字符串转换为double
	 * @param str 待转换字符串
	 * @param defaultValue 默认值
	 * @return double
	 */
	public static Double toDouble(String str, Double defaultValue) {
		Double value = defaultValue;
		if (str == null || str.equals("")) {
			return 0d;
		}
		try {
			value = Double.valueOf(str);
		} catch (Exception ex) {
			ex.printStackTrace();
			value =defaultValue;
		}
		return value;
	}


	/**
	 * 把数组转换成String
	 * 
	 * @param array 数组
	 * @param split 分隔符
	 * @return string
	 */
	public static String arrayToString(Object[] array, String split) {
		if (array == null) {
			return "";
		}
		String str = "";
		for (int i = 0; i < array.length; i++) {
			if (i != array.length - 1) {
				str += array[i].toString() + split;
			} else {
				str += array[i].toString();
			}
		}
		return str;
	}

	/**
	 * 将一个list转为以split分隔的string
	 * 
	 * @param list 目标list
	 * @param split 分割符
	 * @return string
	 */
	public static String listToString(List list, String split) {
		if (list == null || list.isEmpty())
			return "";
		StringBuffer sb = new StringBuffer();
		for (Object obj : list) {
			if (sb.length() != 0) {
				sb.append(split);
			}
			sb.append(obj.toString());
		}
		return sb.toString();
	}

	/**
	 * 得到WEB-INF的绝对路径
	 * 
	 * @return string
	 */
	public static String getWebInfPath() {
		String filePath = Thread.currentThread().getContextClassLoader()
				.getResource("").toString();
		if (filePath.toLowerCase().indexOf("file:") > -1) {
			filePath = filePath.substring(6, filePath.length());
		}
		if (filePath.toLowerCase().indexOf("classes") > -1) {
			filePath = filePath.replaceAll("/classes", "");
		}
		if (System.getProperty("os.name").toLowerCase().indexOf("window") < 0) {
			filePath = "/" + filePath;
		}
		if (!filePath.endsWith("/"))
			filePath += "/";
		return filePath;
	}



	/**
	 * 格式化页码
	 * 
	 * @param page 页码
	 * @return int 格式化后的页码
	 */
	public static int formatPage(String page) {
		int iPage = 1;
		if (page == null || page.equals("")) {
			return iPage;
		}
		try {
			iPage = Integer.parseInt(page);
		} catch (Exception ex) {
			iPage = 1;
		}
		return iPage;
	}

	/**
	 * 将计量单位字节转换为相应单位
	 * 
	 * @param fileSize 计量单位
	 * @return string 相应单位
	 */
	public static String getFileSize(String fileSize) {
		String temp = "";
		DecimalFormat df = new DecimalFormat("0.00");
		double dbFileSize = Double.parseDouble(fileSize);
		if (dbFileSize >= 1024) {
			if (dbFileSize >= 1048576) {
				if (dbFileSize >= 1073741824) {
					temp = df.format(dbFileSize / 1024 / 1024 / 1024) + " GB";
				} else {
					temp = df.format(dbFileSize / 1024 / 1024) + " MB";
				}
			} else {
				temp = df.format(dbFileSize / 1024) + " KB";
			}
		} else {
			temp = df.format(dbFileSize / 1024) + " KB";
		}
		return temp;
	}

	/**
	 * 得到一个32位随机字符
	 * 
	 * @return string
	 */
	public static String getEntry() {
		Random random = new Random(100);
		Date now = new Date();
		SimpleDateFormat formatter = new SimpleDateFormat(new String(
				"yyyyMMddHHmmssS"));
		return md5(formatter.format(now) + random.nextDouble());
	}

	/**
	 * 将中文汉字转成UTF8编码
	 * 
	 * @param str 中文汉字
	 * @return string 转码后的结果
	 */
	public static String toUTF8(String str) {
		if (str == null || str.equals("")) {
			return "";
		}
		try {
			return new String(str.getBytes("ISO8859-1"), "UTF-8");
		} catch (Exception ex) {
			ex.printStackTrace();
			return "";
		}
	}

	/**
	 * 按传入编码转码
	 * @param str 中文
	 * @param charset 编码格式
	 * @return 转码后的数据
	 */
	public static String to(String str, String charset) {
		if (str == null || str.equals("")) {
			return "";
		}
		try {
			return new String(str.getBytes("UTF-8"), charset);
		} catch (Exception ex) {
			ex.printStackTrace();
			return "";
		}
	}

	/**
	 * 获得随机字符串
	 * @param n 字符串长度
	 * @return 随机字符串
	 */
	public static String getRandStr(int n) {
		Random random = new Random();
		String sRand = "";
		for (int i = 0; i < n; i++) {
			String rand = String.valueOf(random.nextInt(10));
			sRand += rand;
		}
		return sRand;
	}

	/**
	 * 得到一个数字的大写(一到十之内)
	 * 
	 * @param num 数字
	 * @return string
	 */
	public static String getChineseNum(int num) {
		String[] chineseNum = new String[] { "一", "二", "三", "四", "五", "六", "七",
				"八", "九", "十" };
		return chineseNum[num];
	}

	/**
	 * 代替回车
	 * @param str 字符串
	 * @return 替代后的数据
	 */
	public static String replaceEnter(String str) {
		if (str == null)
			return null;
		return str.replaceAll("\r", "").replaceAll("\n", "");
	}

	/**
	 * 替代所有
	 * @param source 原字符串
	 * @param target 目标内容
	 * @param content 替换内容
	 * @return 替换后的字符串
	 */
	public static String replaceAll(String source, String target, String content) {
		StringBuffer buffer = new StringBuffer(source);
		int start = buffer.indexOf(target);
		if (start > 0) {
			source = buffer.replace(start, start + target.length(), content)
					.toString();
		}
		return source;
	}

	/**
	 * 去除HTML 元素
	 * 
	 * @param element html内容
	 * @return string
	 */
	public static String getTxtWithoutHTMLElement(String element) {
		if (null == element || "".equals(element.trim())) {
			return element;
		}

		Pattern pattern = Pattern.compile("<[^<|^>]*>");
		Matcher matcher = pattern.matcher(element);
		StringBuffer txt = new StringBuffer();
		while (matcher.find()) {
			String group = matcher.group();
			if (group.matches("<[\\s]*>")) {
				matcher.appendReplacement(txt, group);
			} else {
				matcher.appendReplacement(txt, "");
			}
		}
		matcher.appendTail(txt);
		String temp = txt.toString().replaceAll("\n", "");
		temp = temp.replaceAll(" ", "");
		return temp;
	}

	/**
	 * clear trim to String
	 * @param strtrim 有trim的字符串
	 * @return string
	 */
	public static String toTrim(String strtrim) {
		if (null != strtrim && !strtrim.equals("")) {
			return strtrim.trim();
		}
		return "";
	}

	/**
	 * 转义字串的$
	 * 
	 * @param str 待转换的字符串
	 * @return string
	 */ 
	public static String filterDollarStr(String str) {
		String sReturn = "";
		if (!toTrim(str).equals("")) {
			if (str.indexOf('$', 0) > -1) {
				while (str.length() > 0) {
					if (str.indexOf('$', 0) > -1) {
						sReturn += str.subSequence(0, str.indexOf('$', 0));
						sReturn += "\\$";
						str = str.substring(str.indexOf('$', 0) + 1,
								str.length());
					} else {
						sReturn += str;
						str = "";
					}
				}

			} else {
				sReturn = str;
			}
		}
		return sReturn;
	}

	/**
	 * 压缩html
	 * @param html 待压缩的html
	 * @return 压缩后的html
	 */
	public static String compressHtml(String html) {
		if (html == null)
			return null;

		html = html.replaceAll("[\\t\\n\\f\\r]", "");
		return html;
	}

	/**
	 * 把double数据转换为金钱格式
	 * @param d 待转换的数据
	 * @return 金钱格式的数据
	 */
	public static String toCurrency(Double d) {
		if (d != null) {
			DecimalFormat df = new DecimalFormat("¥#,###.00");
			return df.format(d);
		}
		return "";
	}

	/**
	 * 把int转换成string
	 * @param i 目标数字
	 * @return string
	 */
	public static String toString(Integer i) {
		if (i != null) {
			return String.valueOf(i);
		}
		return "";
	}
	/**
	 * 把double转换成string
	 * @param d 目标小数
	 * @return string
	 */
	public static String toString(Double d) {
		if (null != d) {
			return String.valueOf(d);
		}
		return "";
	}
	/**
	 * Object转String的方法 
	 * @param o 需要转String的对象
	 * @param checked 是否检测异常
	 * @return String 转换之后的字符串
	 */
	public static String toString(Object o,boolean checked) {
		String value="";
		if (null != o) {
			try {
				value = o.toString();

			} catch (Exception e) {
				if (checked) {
					throw new RuntimeException("String类型不正确");
				} 
			}
		}
		return value;
	}

	/**
	 * Object转String的方法 
	 * 若为空,或者转换出现异常 
	 * @param o 需要转String的对象
	 * @return 转换之后的字符串
	 */
	public static String toString(Object o) {
		String value="";
		if (null != o) {
			value =o.toString();
		}
		return value;
	}

	public static String getRandom() {
		int[] array = { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9 };
		Random rand = new Random();
		for (int i = 10; i > 1; i--) {
			int index = rand.nextInt(i);
			int tmp = array[index];
			array[index] = array[i - 1];
			array[i - 1] = tmp;
		}
		int result = 0;
		for (int i = 0; i < 6; i++)
			result = result * 10 + array[i];

		return "" + result;
	}

	/**
	 * 处理树型码 获取本级别最大的code 如:301000 返回301999
	 * 
	 * @param code 码
	 * @return int int
	 */
	public static int getMaxLevelCode(int code) {
		String codeStr = "" + code;
		StringBuffer str = new StringBuffer();
		boolean flag = true;
		for (int i = codeStr.length() - 1; i >= 0; i--) {
			char c = codeStr.charAt(i);
			if (c == '0' && flag) {
				str.insert(0, '9');
			} else {
				str.insert(0, c);
				flag = false;
			}
		}
		return Integer.valueOf(str.toString());
	}

	/**
	 * 去掉sql的注释
	 * @param content sql内容
	 * @return string
	 * 
	 */
	public static String delSqlComment(String content) {
		String pattern = "/\\*(.|[\r\n])*?\\*/";
		Pattern p = Pattern.compile(pattern, 2 | Pattern.DOTALL);
		Matcher m = p.matcher(content);
		if (m.find()) {
			content = m.replaceAll("");
		}
		return content;
	}

	/**
	 * 把输入流转换成string
	 * @param is 输入流
	 * @return string
	 */
	public static String inputStream2String(InputStream is) {
		BufferedReader in = new BufferedReader(new InputStreamReader(is));
		StringBuffer buffer = new StringBuffer();
		String line = "";
		try {
			while ((line = in.readLine()) != null) {
				buffer.append(line);
			}
		} catch (IOException e) {
			e.printStackTrace();
		}
		return buffer.toString();
	}

	/**
	 * 解码
	 * @param keyword  待解码数据
	 * @return string
	 */
	public static String decode(String keyword) {
		try {
			keyword = URLDecoder.decode(keyword, "UTF-8");
		} catch (UnsupportedEncodingException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}

		return keyword;
	}

	/**
	 * 进行解析
	 * 
	 * @param regex 正则
	 * @param rpstr 替换数据
	 * @param source 源数据
	 * @return string 
	 */
	public static String doFilter(String regex, String rpstr, String source) {
		Pattern p = Pattern.compile(regex, 2 | Pattern.DOTALL);
		Matcher m = p.matcher(source);
		return m.replaceAll(rpstr);
	}

	/**
	 * 脚本过滤
	 * 
	 * @param source 源
	 * @return string
	 */
	public static String formatScript(String source) {
		source = source.replaceAll("javascript", "javascript");
		source = source.replaceAll("jscript:", "jscript:");
		source = source.replaceAll("js:", "js:");
		source = source.replaceAll("value", "value");
		source = source.replaceAll("about:", "about:");
		source = source.replaceAll("file:", "file:");
		source = source.replaceAll("document.cookie", "documents.cookie");
		source = source.replaceAll("vbscript:", "vbscript:");
		source = source.replaceAll("vbs:", "vbs:");
		source = doFilter("(on(mouse|exit|error|click|key))", "on$2",
				source);
		return source;
	}

	/**
	 * 格式化HTML代码
	 * 
	 * @param htmlContent html数据
	 * @return string
	 */
	public static String htmlDecode(String htmlContent) {
		htmlContent = formatScript(htmlContent);
		htmlContent = htmlContent.replaceAll(" ", " ")
				.replaceAll("<", "<").replaceAll(">", ">")
				.replaceAll("\n\r", "
").replaceAll("\r\n", "
") .replaceAll("\r", "
"); return htmlContent; } /** * 动态添加表前缀,对没有前缀的表增加前缀 * * @param table 表名 * @param prefix 前缀 * @return string */ public static String addPrefix(String table, String prefix) { String result = ""; if (table.length() > prefix.length()) { if (table.substring(0, prefix.length()).toLowerCase() .equals(prefix.toLowerCase())) result = table; else result = prefix + table; } else result = prefix + table; return result; } /** * 加后缀 * @param table 表名 * @param suffix 后缀 * @return string */ public static String addSuffix(String table, String suffix) { String result = ""; if (table.length() > suffix.length()) { int start = table.length() - suffix.length(); int end = start + suffix.length(); if (table.substring(start, end).toLowerCase() .equals(suffix.toLowerCase())) result = table; else result = table + suffix; } else result = table + suffix; return result; } /** * 得到异常的字串 * @param aThrowable 爆出的异常 * @return string */ public static String getStackTrace(Throwable aThrowable) { final Writer result = new StringWriter(); final PrintWriter printWriter = new PrintWriter(result); aThrowable.printStackTrace(printWriter); return result.toString(); } /** * 判断Integer是否为空 * @param i 需要校验的Integer对象 * @param includeZero 是否包含0 * @return boolean */ public static boolean isEmpty(Integer i,boolean includeZero){ if(includeZero){ if(i==null||i.equals(0)){ return true; } } if(i==null){ return true; } return false; } /** * 判断是否是数字,传入字符串,判断是否是数字,true 是 false 否 * @param str 字符串 * @return boolean */ public static boolean isNumber(String str) { Pattern patternInteger = Pattern.compile("^[-\\+]?[\\d]*$"); //是否是整数 Pattern patternDouble = Pattern.compile("^[-\\+]?[.\\d]*$"); //是否是小数 return patternInteger.matcher(str).matches() || patternDouble.matcher(str).matches(); } }




© 2015 - 2024 Weber Informatics LLC | Privacy Policy