StringUitl
来源:互联网 发布:知止阅读答案 编辑:程序博客网 时间:2024/05/17 03:02
package com.lzh.util;import java.util.Date;import java.util.Random;/** * 字符串处理工具类 * * @author luozehua * @date 2014年3月20日 * @time 下午4:24:18 */public class StringUtil {/** * 加权因子 */private final static int[] DIVISOR = { 7, 9, 10, 5, 8, 4, 2, 1, 6, 3, 7, 9, 10, 5, 8, 4, 2 };/** * 校验码 */private final static char[] VALIDATECODE = { '1', '0', 'X', '9', '8', '7', '6', '5', '4', '3', '2' };/** * 验证码字符表 */private final static char[] CHECKNO = { '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'a', 'b', 'c', 'd', 'e','f', 'g', 'h', 'i', 'j', 'k', 'm', 'n', 'p', 'q', 'r', 's', 't', 'u', 'v', 'w', 'x', 'y' };/** * 检查一个字符串是否为空(null、“”或全部为空格) * * @param checkString * @return */public static boolean isEmpty(final String checkString) {return checkString == null || checkString.trim().length() == 0;}/** * 检查一个字符串是否为数字(包含小数) * * @param checkString * @return */public static boolean isDigit(final String checkString) {return checkString.matches("^\\d+$") || checkString.matches("^\\d+(\\.\\d+)*$");}/** * 解析一个文件名字符串,取文件的扩展名 * * @param fileName * 文件名 * @return 文件名后缀 */public static String getFileSuffix(final String fileName) {if (isEmpty(fileName)) {return "-1";} else if (fileName.indexOf(".") == 0) {return "-1";}if (fileName.split("\\.").length == 1) {// 没有后缀名return null;}return fileName.substring(fileName.lastIndexOf(".") + 1);}/** * 解析一个文件名字符串,取不含扩展名的文件名 * * @param fileName * 文件名 * @return 去除后缀后的文件名 */public static String getStringExceptFileSuffix(final String fileName) {if (isEmpty(fileName)) {return "-1";} else if (fileName.indexOf(".") == 0) {return "-1";}if (fileName.split("\\.").length == 1) {// 没有后缀名return fileName.substring(0, fileName.length() - 1);}return fileName.substring(0, fileName.lastIndexOf("."));}/** * 生成一个指定位数的验证码,规则如下: * 验证码每一位可取:数字0~9,小写字母a、b、c、d、e、f、g、h、i、j、k、m、n、p、q、r、s、t、u、v、w、x、y * 验证码每一位随机取以上字符 * * @param number * 验证码的位数 * @return */public static String getCheckNum(final int number) {if (number == 0) {return "0位验证码";}String checkString = "";// 产生0~32之间的随机数Random random = new Random();for (int i = 0; i < number; i++) {int num = random.nextInt(CHECKNO.length);checkString += CHECKNO[num];}return checkString;}/** * 根据指定的ID(数字字符串)生成一个指定长度的新ID,规则如下: * ■ 如果指定的ID为空,生成的ID全部为“0” * ■如果指定的ID不为空,生成的ID值取指定ID的值再加1 * ■ 如果生成的ID不够指定的长度,则左补“0” * @param oldId * 原有的ID * @param length * 新生成ID的长度 * @return */public static String getNewIdByOldId(final String oldId, final Integer length) {StringBuffer buffer = new StringBuffer();// 指定的ID为空,生成的ID全部为“0”if (StringUtil.isEmpty(oldId)) {return String.format("%0" + length + "d", 0);}// 指定的ID不是数字字符串if (!StringUtil.isDigit(oldId)) {return "-1";}// 原字符长度int oldIdLength = oldId.length();int index = 0;// 指定输出长度小于原有ID长度if (oldIdLength > length) {return "-1";}// 找到最后一个不是为9的位置for (int i = oldIdLength - 1; i >= 0; i--) {if (oldId.charAt(i) != '9') {index = i;break;}}if (index == 0) {// 全部字符都为9int first = Integer.parseInt(oldId.charAt(0) + "");if (first == 9) {buffer.append(1).append(String.format("%0" + oldIdLength + "d", 0));} else {buffer.append(first + 1).append(oldId.substring(1));}return getNewId(length, buffer);} else if (index == oldIdLength - 1) {// 最后位置没有出现9buffer.append(oldId.substring(0, oldIdLength - 1)).append((char) ((int) oldId.charAt(oldIdLength - 1) + 1));return getNewId(length, buffer);} else {buffer.append(oldId.substring(0, index)).append((char) ((int) oldId.charAt(index) + 1)).append(String.format("%0" + (oldId.length() - index - 1) + "d", 0));return getNewId(length, buffer);}}private static String getNewId(final Integer length, StringBuffer newBuffer) {if (newBuffer.length() > length) {return "-1";} else if (newBuffer.length() == length) {return newBuffer.toString();} else {return String.format("%0" + (length - newBuffer.length()) + "d", 0).concat(newBuffer.toString());}}/** * 检查一个字符串是否符合手机号格式。格式为: * ■ 长度11位 * ■ 每一位必须为数字 * * @param phoneNum * 要验证的手机号码 * @return */public static boolean isMobile(final String phoneNum) {return phoneNum.matches("^1[34589]\\d{9}$");}/** * 检查一个字符串是否符合电话号码格式。格式为: * ■ 每一位只允许数字或连接符“-” * ■ “-”两边不得为空 * @param phoneNum * @return */public static boolean isPhone(final String phoneNum) {return phoneNum.matches("^(\\d{3,4}-)\\d{7,8}$");}/** * 检查一个字符串是否符合Email格式。格式为: 必须包函且只能包函一个符号“@” “@”两边不得为空 * * @param email * 要验证的邮箱地址 * @return */public static boolean isEmail(final String email) {return email.matches("^\\w+([-+.]\\w+)*@\\w+([-.]\\w+)*\\.\\w+([-.]\\w+)*$");}/** * 检查一个字符串是否符合旧身份证号格式。格式为: * ■ 长度15位 * ■ 每一位必须为数字 * ■ 出生日期必须为一个合法日期(年、月、日必须合法) * ■出生日期在(19)00年1月1日至(19)99年12月31日之间 * ■ 旧身份证号编码规则: * 1.第1至6位为身份证编码对象的所在地(出生地)的编码 * 2.第7至12位为出生年、月、日(YYMMDD,不包含世纪) * 3.第13至15位为顺序号。男性为奇数,女性为偶数 * * @param oldIdCard * 旧的身份证 * @return */public static boolean isOldIdCard(final String oldIdCard) {if (!oldIdCard.matches("^\\d{15}$")) {return false;}String birthday = oldIdCard.substring(6, 12);if (!DateTimeUtil.isDateStr(birthday, "yyMMdd")) {return false;}return true;}/** * 检查一个字符串是否符合新身份证号格式。格式为: * • 长度18位 • 前17位必须为数字;第18位可以是数字、“X”或“x” * • 出生日期必须为一个合法日期(年、月、日必须合法) * • 出生日期在1900年1月1日至当前日期之前 * • 校验位合法 * • 新身份证号编码规则 * 1.第1至6位为身份证编码对象的所在地(出生地)的编码 * 2. 第7至14位为出生年、月、日(YYYYMMDD) * 3.第15至17位为顺序号。男性为奇数,女性为偶数 * 4. 第18位为校验位,计算规则为: * A.前17位的数字不其对应的加权因子:7、9、10、5、8、4、2、1、6、3、7、9、10、5、8、4、2相乘 * B . 再将积相加 * C.最后的和再除以11,取其余 D. 根据余数0到10,取对应的校验码:1、0、X、9、8、7、6、5、4、3、2 * @param newIdCard * 二代身份证 * @return */public static boolean isNewIdCard(final String newIdCard) {if (!newIdCard.matches("^\\d{17}(\\d|x|X)$")) {return false;}String birthday = newIdCard.substring(6, 14);if (!DateTimeUtil.isDateStr(birthday, "yyyyMMdd")) {return false;}if (DateTimeUtil.parseStringToDate(birthday, "yyyyMMdd").after(new Date())) {return false;}// 检验最后以为if (!checkLastLetter(newIdCard)) {return false;}return true;}/** * 检验新身份证最后一个校验位的合法性 * @param newIdCard * @return */private static boolean checkLastLetter(final String newIdCard) {String str = newIdCard.substring(0, 17);String last = newIdCard.substring(17);// 加权因子校验char[] numChar = str.toCharArray();Long result = 0L;for (int i = 0; i < numChar.length; i++) {result += Integer.parseInt(Character.toString(numChar[i])) * DIVISOR[i];}int checkIndex = (int) (result % 11);if (Character.toString(last.toCharArray()[0]).equalsIgnoreCase(Character.toString(VALIDATECODE[checkIndex]))) {return true;}return false;}/** * 将一个旧身份证号升级为一个新身份证号(世纪取19) * * @param oldIdCard * @return */public static String changeOldIdCardToNewIdCard(final String oldIdCard) {if (!StringUtil.isOldIdCard(oldIdCard)) {return "-1";}// 获取旧身份证的前六位String locationStr = oldIdCard.substring(0, 6);String idStr = oldIdCard.substring(6);String newId = locationStr.concat("19").concat(idStr);// 计算出校验因子char[] numChar = newId.toCharArray();Long result = 0L;for (int i = 0; i < numChar.length; i++) {result += Integer.parseInt(Character.toString(numChar[i])) * DIVISOR[i];}int checkIndex = (int) (result % 11);String lastStr = Character.toString(VALIDATECODE[checkIndex]);return newId.concat(lastStr);}}
0 0
- StringUitl
- 如何在xcode种快速添加一个设备到证书中。
- poj1573_简单模拟
- 数学—杭电1030 Delta-wave
- Leetcode_maximal-rectangle
- android listview异步加载图片
- StringUitl
- 手机web——自适应网页设计(html/css控制)
- SEO的组成远远比你想象的复杂的多
- JavaScript 闭包及其机制
- ASP.NET Error:Adding the specified count to the semaphore would cause it to exceed its maximum count
- 心得总结
- 学习笔记_linux——linux基本指令
- 文件指针问题(2)
- 【HNOI2003】多边形