package com.baidu.dsp.common.constraint.validation; import javax.validation.ConstraintValidator; import javax.validation.ConstraintValidatorContext; import com.baidu.dsp.common.constraint.ChineseLengthConstrant; /** * 中文长度校验实现 * * @author zhangbi * @date 2014年1月13日下午9:26:39 */ public class ChineseLengthValidator implements ConstraintValidator<ChineseLengthConstrant, String> { private long maxLength; private long minLength; private int chineseHoldLength; @Override public void initialize(ChineseLengthConstrant constraintAnnotation) { this.maxLength = constraintAnnotation.maxLength(); this.minLength = constraintAnnotation.minLength(); this.chineseHoldLength = constraintAnnotation.cnHoldLength(); } @Override public boolean isValid(String value, ConstraintValidatorContext context) { if (value == null || value.equals("")) { return true; } // 如果字符串总长度大于最大长度直接返回false,避免下面轮个判断处理 if (value.length() * this.chineseHoldLength > maxLength) { return false; } long chineseLength = getChineseLength(value); if (chineseLength >= minLength && chineseLength <= maxLength) { return true; } return false; } /** * 获取中文字符串长度 中文算N个字符(N由{@link ChineseLengthConstrant#cnHoldLength()}指定, * 默认为2),英文算一个 * * @param value * * @return */ private long getChineseLength(String value) { long valueLength = 0; for (int i = 0; i < value.length(); i++) { /* 获取一个字符 */ char temp = value.charAt(i); /* 判断是否为中文字符 */ if ((temp >= '\u4e00' && temp <= '\u9fa5') || (temp >= '\ufe30' && temp <= '\uffa0')) { /* 中文长度倍数 */ valueLength += this.chineseHoldLength; } else { /* 其他字符长度为1 */ valueLength += 1; } } return valueLength; } }