package com.jd.jnlu.core.utils;
import java.util.*;
public class ChineseNumberUtil {
private static Map<String,Integer> numberMap=new HashMap<>();
private static Set<String> set=new HashSet<>();
boolean flag=false;
static {
numberMap.put("零",0);
numberMap.put("一",1);
numberMap.put("二",2);
numberMap.put("三",3);
numberMap.put("四",4);
numberMap.put("五",5);
numberMap.put("六",6);
numberMap.put("七",7);
numberMap.put("八",8);
numberMap.put("九",9);
numberMap.put("十",0);
set.add("十");
set.add("百");
set.add("千");
set.add("万");
set.add("亿");
set.add("点");
set.addAll(numberMap.keySet());
}
//纯整数
private static int chineseNumber2Int(String chineseNumber){
if(chineseNumber.equals("0")||chineseNumber.equals("零")){
return 0;
}
int result = 0;
int temp = 1;//存放一个单位的数字如:十万
int count = 0;//判断是否有chArr
char[] cnArr = new char[]{'一','二','三','四','五','六','七','八','九'};
char[] chArr = new char[]{'十','百','千','万','亿'};
for (int i = 0; i < chineseNumber.length(); i++) {
boolean b = true;//判断是否是chArr
char c = chineseNumber.charAt(i);
for (int j = 0; j < cnArr.length; j++) {//非单位,即数字
if (c == cnArr[j]) {
if(0 != count){//添加下一个单位之前,先把上一个单位值添加到结果中
result += temp;
temp = 1;
count = 0;
}
// 下标+1,就是对应的值
temp = j + 1;
b = false;
break;
}
}
if(b){//单位{'十','百','千','万','亿'}
for (int j = 0; j < chArr.length; j++) {
if (c == chArr[j]) {
switch (j) {
case 0:
temp *= 10;
break;
case 1:
temp *= 100;
break;
case 2:
temp *= 1000;
break;
case 3:
temp *= 10000;
break;
case 4:
temp *= 100000000;
break;
default:
break;
}
count++;
}
}
}
if (i == chineseNumber.length() - 1) {//遍历到最后一个字符
result += temp;
}
}
return result;
}
//小数
public static String decimalNumber(String decimalStr){
if(null == decimalStr || decimalStr.trim().length() == 0){
return null;
}
long len=decimalStr.length();
StringBuilder stringBuilder=new StringBuilder();
for (int i=0;i<len;i++){
stringBuilder.append(numberMap.get(decimalStr.charAt(i)+""));
}
return stringBuilder.toString();
}
//字符串分段
public static Map<String,String> splits(String str){
Map<String,String> list=new HashMap<>();
int length=str.length();
int count=length-1;
int indexOne=-1;
int indexTwo=-1;
for (;count>0;count--){
char temp=str.charAt(count);
if(temp=='万'&&indexOne==-1){
indexOne=count;
}
if(temp=='亿'&&indexTwo==-1){
indexTwo=count;
}
}
if(indexOne==-1&&indexTwo==-1){
list.put("千",str);
}
if(indexTwo!=-1&&indexOne!=-1){
list.put("亿",str.substring(0,indexTwo));
list.put("万",str.substring(indexTwo+1,indexOne));
list.put("千",str.substring(indexOne+1,length));
}
if(indexOne!=-1&&indexTwo==-1){
list.put("万",str.substring(0,indexOne));
list.put("千",str.substring(indexOne+1,length));
}
if(indexOne==-1&&indexTwo!=-1){
list.put("亿",str.substring(0,indexTwo));
list.put("千",str.substring(indexTwo+1,length));
}
return list;
}
public static String getNumber(String str){
str=str.replace("两","二");
Map<String,String> maps=new HashMap<>();
if(str.equals("十")){
return "10";
}
String decimalStr="";
if(str.contains("点")){
String[] strs=str.split("点");
decimalStr=strs[1];
maps=ChineseNumberUtil.splits(strs[0]);
}else {
maps=ChineseNumberUtil.splits(str);
}
String decimal=decimalNumber(decimalStr);
long temp=0l;
if(maps.containsKey("亿")){
temp+=chineseNumber2Int(maps.get("亿"))*100000000l;
}
if(maps.containsKey(("万"))){
temp+=chineseNumber2Int(maps.get("万"))*10000;
}
if (maps.containsKey("千")){
temp+=chineseNumber2Int(maps.get("千"));
}
if(null==decimal||decimal.equals("0")){
return temp+"";
}
return temp+"."+decimal;
};
//判断字符串是否有中文数字
public static String getString(String str){
str=str.replace("两","二").replace("-","负");
//.replace("平方除","平方除以").replace("平方乘","平方乘以").replace("平方加","平方加上").replace("平方减","平方减去");
List<String> listStr=new ArrayList<>();//捕捉字符串截取的字符段
StringBuilder stringBuilder=new StringBuilder();
String strStart="";//保存句子开头
int pos=0;
int count=-1;//标志位,确定数字的位置
if(str.contains("算一下")){
strStart=str.substring(0,str.indexOf("下")+1);
listStr.add(strStart);
//stringBuilder.append(strStart);
str=str.substring(str.indexOf("下")+1);
}
str=str+"end_tag";
int begin=-1;
int end=-1;
for(int i=0;i<str.length();i++){
if(numberMap.containsKey(str.charAt(i)+"")&&begin==-1){
begin=i;
continue;
}
if(begin!=-1){
if(set.contains(str.charAt(i)+"")){
if((i+1)<str.length()){
if(set.contains(str.charAt(i+1)+"")){
continue;
}else {
if(end==-1){
end=i+1;
}
}
}else {
end=i+1;
}
}else {
end=i;
}
}
if(begin!=-1&&end!=-1){
//去数字
listStr.add(str.substring(pos,begin));
pos=end;
String number=getNumber(str.substring(begin,end));
listStr.add(number);
begin=-1;
end=-1;
}
}
listStr.add(str.substring(pos));
for(String strs:listStr){
stringBuilder.append(strs);
}
String result=stringBuilder.toString();
if(result.endsWith("end_tag")){
result=result.substring(0,result.length()-7);
}
return result;
};
}
/****大家有什么更好的建议,可以点评,希望大家指出错误