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

5 篇文章 0 订阅
3 篇文章 0 订阅

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

}

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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值