中文数字转阿拉伯数字-----终极

xiaoxiao2025-11-13  8

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; };

}

/****大家有什么更好的建议,可以点评,希望大家指出错误

转载请注明原文地址: https://www.6miu.com/read-5039555.html

最新回复(0)