注意:需要两个函数配合使用
package com.huayunworld.robot.util.similarity;
import org.apache.commons.lang3.StringUtils;
import java.time.LocalDate;
import java.time.LocalDateTime;
import java.time.LocalTime;
import java.time.format.DateTimeFormatter;
import java.util.HashMap;
import java.util.Map;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
/**
* @author lilonglong
* @Description 中文数字转换阿拉伯数字工具类(时间补齐处理)
* @date 2021/11/10 10:05
*/
public class NumberConvertUtils {
/**
* 中文数字与阿拉伯数字的映射对象
*/
private static Map<String, Integer> map = new HashMap<>();
/**
* 中文单位与阿拉伯的映射
*/
private static Map<String, Integer> units = new HashMap<>();
/**
* 特殊的转换成阿拉伯数字(例如东3--》03)
*/
private static Map<String, Integer> regixMap = new HashMap<>();
private static String regixContent = "[东](\\d+)";
/**
* 中文数字
*/
private static Pattern pattern = Pattern.compile("一|幺|二|三|四|五|六|七|拐|八|九|零|洞|壹|贰|叁|肆|伍|陆|柒|捌|玖|两|俩|仨");
/**
* 单位
*/
private static Pattern unitPattern = Pattern.compile("(\\d?)[十|百|千](\\d?)");
/**
* 是否开启转换(默认开启)
*/
public static boolean enableConversion = true;
/**
* 部分转换正则表达式
*/
private static Pattern conversionPattern = Pattern.compile
("[一|幺|二|三|四|五|六|七|拐|八|九|零|洞|壹|贰|叁|肆|伍|陆|柒|捌|玖|两|俩|仨|十]{1,}[开关|kv|KV|Kv|kV|线|百|千|万]{1,}");
private static Pattern date = Pattern.compile("[\\d]{4}[年]{1}[\\d]{1,2}[月]{1}[\\d]{1,2}");
/**
* 标准的时间
*/
private static Pattern time = Pattern.compile("[\\d]{1,2}[点|时|.]{1}[\\d]{1,2}");
/**
* 整点
*/
private static Pattern timeAll = Pattern.compile("[\\d]{1,2}[点|时|.]{1}[整]{0,1}");
/**
* 半点
*/
private static Pattern timeHalf = Pattern.compile("[\\d]{1,2}[点|时|.]{1}[半]{1}");
static {
map.put("零", 0);
map.put("洞", 0);
map.put("一", 1);
map.put("幺", 1);
map.put("壹", 1);
map.put("二", 2);
map.put("两", 2);
map.put("俩", 2);
map.put("贰", 2);
map.put("三", 3);
map.put("叁", 3);
map.put("四", 4);
map.put("肆", 4);
map.put("五", 5);
map.put("伍", 5);
map.put("六", 6);
map.put("陆", 6);
map.put("七", 7);
map.put("拐", 7);
map.put("柒", 7);
map.put("八", 8);
map.put("捌", 8);
map.put("九", 9);
map.put("玖", 9);
units.put("十", 10);
units.put("百", 100);
units.put("千", 1000);
regixMap.put("东", 0);
}
/**
* 中文转换阿拉伯
*
* @param src 需要转换的元数据
* @return
*/
public static String ChineseConvertAlb(String src) {
src = src.replaceAll("千伏|千胡", "kV");
if (!enableConversion) {
src = covertAlbPart(src);
} else {
src = convertAlb(src);
}
String convertUnit = convertUnit(new StringBuffer(src));
return convertUnit;
}
/**
* 开启部分转换
*
* @param src
* @return
*/
private static String covertAlbPart(String src) {
Matcher convertMatcher = conversionPattern.matcher(src);
while (convertMatcher.find()) {
StringBuffer stringBuffer = new StringBuffer();
String group = convertMatcher.group();
char[] chars = group.toCharArray();
for (char aChar : chars) {
Matcher matcher = pattern.matcher(aChar + "");
if (matcher.find()) {
Integer a = map.get(aChar + "");
stringBuffer.append(a.toString());
} else {
stringBuffer.append(aChar + "");
}
}
src = src.replaceAll(group, stringBuffer.toString());
}
return src;
}
/**
* 转换调令
*
* @param src
* @return
*/
private static String convertAlb(String src) {
StringBuffer stringBuffer = new StringBuffer();
char[] chars = src.toCharArray();
for (char aChar : chars) {
Matcher matcher = pattern.matcher(aChar + "");
if (matcher.find()) {
Integer a = map.get(aChar + "");
stringBuffer.append(a.toString());
} else {
stringBuffer.append(aChar + "");
}
}
System.out.println("stringBuffer = " + stringBuffer.toString());
String string = stringBuffer.toString();
return string;
}
/**
* 转换单位
*
* @param string
* @return
*/
private static String convertUnit(StringBuffer string) {
String result = string.toString();
Matcher matcher = unitPattern.matcher(result);
while (matcher.find()) {
String group = matcher.group();
int indexOf = result.indexOf(group);
Integer num = 1;
char[] toCharArray = group.toCharArray();
for (int i = 0; i < toCharArray.length; i++) {
char c = toCharArray[i];
if (StringUtils.isNumeric(c + "")) {
if (i == 0) {
num = Integer.valueOf(c + "");
} else {
num = num + Integer.valueOf(c + "");
}
} else {
Integer integer = units.get(c + "");
num = num * integer;
}
}
result = string.replace(indexOf, indexOf + group.length(), num.toString()).toString();
}
System.out.println("string = " + result);
return result;
}
/**
* 处理特殊字符
*
* @param src
* @return
*/
public static String handleSpecialKeyword(String src) {
Pattern compile = Pattern.compile(regixContent);
Matcher matcher = compile.matcher(src);
while (matcher.find()) {
String group = matcher.group();
String s1 = group.substring(0, 1);
String s2 = group.substring(1);
src = src.replaceAll(group, regixMap.get(s1) + s2);
}
return src;
}
/**
* 时间不到10(两位)前面用0补齐
*
* @param group
* @return
*/
public static String makeUpTime(String group, String format) {
String extract;
boolean flag = true;
//标准时间匹配
Matcher matcher = time.matcher(group);
Matcher matcher1 = timeHalf.matcher(group);
Matcher matcher2 = timeAll.matcher(group);
if (matcher.find()) {
extract = matcher.group();
}
//半点时间匹配
else if (matcher1.find()) {
String group1 = matcher1.group();
extract = group1.substring(0, group1.indexOf("半")) + "30";
}
//整点时间匹配
else if (matcher2.find()) {
String group2 = matcher2.group();
int endIndex = group2.indexOf("整");
extract = endIndex != -1 ? group2.substring(0, endIndex) + "00" : group2 + "00";
}
//没有匹配上
else {
extract = "";
flag = false;
}
if (flag) {
LocalDate now = LocalDate.now();
//日期
Matcher matcher3 = date.matcher(group);
if (matcher3.find()) {
String date = matcher3.group();
System.out.println("date = " + date);
now = LocalDate.parse(date, DateTimeFormatter.ofPattern("yyyy年M月d"));
}
LocalTime localTime = LocalTime.parse(extract, DateTimeFormatter.ofPattern("H点m"));
LocalDateTime localDateTime = LocalDateTime.of(now, localTime);
extract = localDateTime.format(DateTimeFormatter.ofPattern(format));
}
return extract;
}
}