将字符串中的中文数字转换成阿拉伯数字

1、正则表达式的处理工具类

public class RexUtils {
   
    public static String and(String... rules) {
        StringBuffer sb = new StringBuffer();
        for (String rule : rules) {
            sb.append("(").append(rule).append(")");
        }
        return sb.toString();
    }

    public static String or(String... rules) {
        StringBuffer sb = new StringBuffer();
        for (String rule : rules) {
            if (sb.length() != 0) {
                sb.append("|");
            }
            sb.append("(").append(rule).append(")");
        }
        return sb.toString();
    }

    public static String more(String rule) {
        StringBuffer sb = new StringBuffer();
        sb.append("[").append(rule).append("]+");
        return sb.toString();
    }

    public static String nullOrMore(String rule) {
        StringBuffer sb = new StringBuffer();
        sb.append("[").append(rule).append("]*");
        return sb.toString();
    }

    public static String getFind(String data, String rule) {
        Matcher m = Pattern.compile(rule).matcher(data);
        StringBuffer sb = new StringBuffer();
        while (m.find()) {
            sb.append(String.valueOf(m.group()));
            return sb.toString();
        }
        return "";
    }

}
2、使用ChineseNumberUtil调用方法获取阿拉伯数字

/**
 * 从字符串中获取中文数字并转换为阿拉伯数字
 * Created by huomengyuan on 2017/4/14.
 */
public class ChineseNumberUtil {
    /**
     * @param value 需要转换的字符串
     * @return
     */
    public static long getNumbers(String value) {
        value = value.replace("零", "");
        ChineseNumber1x chineseNumber1x = new ChineseNumber1x(value);
        ChineseNumber10000 chineseNumber10000 = new ChineseNumber10000(value = value.replace(chineseNumber1x.getData(), ""));
        ChineseNumber1000 chineseNumber1000 = new ChineseNumber1000(value = value.replace(chineseNumber10000.getData(), ""));
        ChineseNumber100 chineseNumber100 = new ChineseNumber100(value = value.replace(chineseNumber1000.getData(), ""));
        ChineseNumber10 chineseNumber10 = new ChineseNumber10(value = value.replace(chineseNumber100.getData(), ""));
        ChineseNumber1 chineseNumber1 = new ChineseNumber1(value.replace(chineseNumber10.getData(), ""));

        long number1x = chineseNumber1x.getNumber();
        long number10000 = chineseNumber10000.getNumber();
        long number1000 = chineseNumber1000.getNumber();
        long number100 = chineseNumber100.getNumber();
        long number10 = chineseNumber10.getNumber();
        long number1 = chineseNumber1.getNumber();

        long total = number1 + number10 + number100 + number1000 + number10000 + number1x;
        return total;
    }
}
3、辅助类:

1>1>1>1>1>

/**
 * 处理个位数
 * Created by huomengyuan on 2017/4/14.
 */
public class ChineseNumber1 {
    public final static String number0 = "零";
    public final static String number1 = "一|壹";
    public final static String number2 = "二|两|貳|贰";
    public final static String number3 = "叁|參|三";
    public final static String number4 = "肆|四";
    public final static String number5 = "五|伍";
    public final static String number6 = "陸|陆|六";
    public final static String number7 = "柒|七";
    public final static String number8 = "捌|八";
    public final static String number9 = "九|玖";

    private long number = 0;

    public ChineseNumber1() {

    }

    public ChineseNumber1(String data) {
        if (TextUtils.isEmpty(data)) {
            return;
        }
        if (!TextUtils.isEmpty(RexUtils.getFind(data, number0))) {
            number = 0;
        } else if (!TextUtils.isEmpty(RexUtils.getFind(data, number1))) {
            number = 1;
        } else if (!TextUtils.isEmpty(RexUtils.getFind(data, number2))) {
            number = 2;
        } else if (!TextUtils.isEmpty(RexUtils.getFind(data, number3))) {
            number = 3;
        } else if (!TextUtils.isEmpty(RexUtils.getFind(data, number4))) {
            number = 4;
        } else if (!TextUtils.isEmpty(RexUtils.getFind(data, number5))) {
            number = 5;
        } else if (!TextUtils.isEmpty(RexUtils.getFind(data, number6))) {
            number = 6;
        } else if (!TextUtils.isEmpty(RexUtils.getFind(data, number7))) {
            number = 7;
        } else if (!TextUtils.isEmpty(RexUtils.getFind(data, number8))) {
            number = 8;
        } else if (!TextUtils.isEmpty(RexUtils.getFind(data, number9))) {
            number = 9;
        }
    }

    public long getNumber() {
        return number;
    }
}

2>2>2>

/**
 * 处理十位数
 * Created by huomengyuan on 2017/4/14.
 */
public class ChineseNumber10 {
    public final static String number10 = "十|拾";
    private final long unit = 10;

    private final String rex = RexUtils.and(RexUtils.nullOrMore(RexUtils.or("", ChineseNumber1.number0, ChineseNumber1.number1, ChineseNumber1.number2, ChineseNumber1.number3,
            ChineseNumber1.number4, ChineseNumber1.number5, ChineseNumber1.number6, ChineseNumber1.number7, ChineseNumber1.number8, ChineseNumber1.number9)),
            number10);

    private ChineseNumber1 number = new ChineseNumber1();

    private String mData = "";

    public ChineseNumber10(String data) {
        mData = RexUtils.getFind(data, rex);
        if (!TextUtils.isEmpty(mData)) {
            String numberData = String.valueOf(mData.subSequence(0, mData.length() - 1));
            if (TextUtils.isEmpty(numberData)) {
                numberData = "一";
            }
            number = new ChineseNumber1(numberData);
        }
    }

    public ChineseNumber10() {
        number = new ChineseNumber1();
    }

    public long getNumber() {
        return number.getNumber() * unit;
    }

    public String getData() {
        return mData;
    }
}
3>3>3>

扫描二维码关注公众号,回复: 2253592 查看本文章
/**
 * 处理百位数
 * Created by huomengyuan on 2017/4/14.
 */
public class ChineseNumber100 {
    public final static String number100 = "佰|百";
    private final long unit = 100;

    private final String rex = RexUtils.and(RexUtils.more(RexUtils.or(ChineseNumber1.number0, ChineseNumber1.number1, ChineseNumber1.number2, ChineseNumber1.number3,
            ChineseNumber1.number4, ChineseNumber1.number5, ChineseNumber1.number6, ChineseNumber1.number7, ChineseNumber1.number8, ChineseNumber1.number9,
            ChineseNumber10.number10)), number100);

    private ChineseNumber1 number = new ChineseNumber1();

    private String mData = "";

    public ChineseNumber100(String data) {
        mData = RexUtils.getFind(data, rex);
        if (!TextUtils.isEmpty(mData)) {
            number = new ChineseNumber1(String.valueOf(mData.subSequence(0, mData.length() - 1)));
        }
    }

    public ChineseNumber100() {
        number = new ChineseNumber1();
    }

    public long getNumber() {
        return number.getNumber() * unit;
    }

    public String getData() {
        return mData;
    }
}
4>4>4>

/**
 * 处理千位数
 * Created by huomengyuan on 2017/4/14.
 */
public class ChineseNumber1000 {
    private final long unit = 1000;
    public final static String number1000 = "千|仟";

    private final String rex = RexUtils.and(RexUtils.more(RexUtils.or(ChineseNumber1.number0, ChineseNumber1.number1, ChineseNumber1.number2, ChineseNumber1.number3,
            ChineseNumber1.number4, ChineseNumber1.number5, ChineseNumber1.number6, ChineseNumber1.number7, ChineseNumber1.number8, ChineseNumber1.number9,
            ChineseNumber10.number10, ChineseNumber100.number100)), number1000);

    private ChineseNumber1 number = new ChineseNumber1();

    private String mData = "";

    public ChineseNumber1000(String data) {
        mData = RexUtils.getFind(data, rex);
        if (!TextUtils.isEmpty(mData)) {
            number = new ChineseNumber1(String.valueOf(mData.subSequence(0, mData.length() - 1)));
        }
    }

    public ChineseNumber1000() {
        number = new ChineseNumber1();
    }

    public long getNumber() {
        return number.getNumber() * unit;
    }

    public String getData() {
        return mData;
    }
}
5>5>5>

/**
 * 处理万位数
 * Created by huomengyuan on 2017/4/14.
 */
public class ChineseNumber10000 {
    private final long unit = 10000;
    public final static String number10000 = "万|萬";

    private final String rex = RexUtils.and(RexUtils.more(RexUtils.or(ChineseNumber1.number0, ChineseNumber1.number1, ChineseNumber1.number2, ChineseNumber1.number3,
            ChineseNumber1.number4, ChineseNumber1.number5, ChineseNumber1.number6, ChineseNumber1.number7, ChineseNumber1.number8, ChineseNumber1.number9,
            ChineseNumber10.number10, ChineseNumber100.number100, ChineseNumber1000.number1000)), number10000);

    private ChineseNumber1000 number1000 = new ChineseNumber1000();
    private ChineseNumber100 number100 = new ChineseNumber100();
    private ChineseNumber10 number10 = new ChineseNumber10();
    private ChineseNumber1 number1 = new ChineseNumber1();

    private String mData = "";

    public ChineseNumber10000() {
        number1000 = new ChineseNumber1000();
        number100 = new ChineseNumber100();
        number10 = new ChineseNumber10();
        number1 = new ChineseNumber1();
    }

    public ChineseNumber10000(String data) {
        mData = RexUtils.getFind(data, rex);
        if (!TextUtils.isEmpty(mData)) {
            String numberData = String.valueOf(mData.subSequence(0, mData.length() - 1));
            number1000 = new ChineseNumber1000(numberData);
            number100 = new ChineseNumber100(numberData = numberData.replace(number1000.getData(), ""));
            number10 = new ChineseNumber10(numberData = numberData.replace(number100.getData(), ""));
            number1 = new ChineseNumber1(numberData.replace(number10.getData(), ""));
        }
    }

    public long getNumber() {
        long number = number1000.getNumber() + number100.getNumber() + number10.getNumber() + number1.getNumber();
        return number * unit;
    }

    public String getData() {
        return mData;
    }
}
6>6>6>

/**
 * 处理亿位数
 * Created by huomengyuan on 2017/4/14.
 */
public class ChineseNumber1x {
    public final static String number1x = "億|亿";
    private final long unit = 100000000;

    private final String rex = RexUtils.and(RexUtils.more(RexUtils.or(ChineseNumber1.number0, ChineseNumber1.number1, ChineseNumber1.number2, ChineseNumber1.number3,
            ChineseNumber1.number4, ChineseNumber1.number5, ChineseNumber1.number6, ChineseNumber1.number7, ChineseNumber1.number8, ChineseNumber1.number9,
            ChineseNumber10.number10, ChineseNumber100.number100, ChineseNumber1000.number1000, ChineseNumber10000.number10000)), number1x);

    private ChineseNumber10000 number10000 = new ChineseNumber10000();
    private ChineseNumber1000 number1000 = new ChineseNumber1000();
    private ChineseNumber100 number100 = new ChineseNumber100();
    private ChineseNumber10 number10 = new ChineseNumber10();
    private ChineseNumber1 number1 = new ChineseNumber1();

    private String mData = "";

    public ChineseNumber1x(String data) {
        mData = RexUtils.getFind(data, rex);
        if (!TextUtils.isEmpty(mData)) {
            String numberData = String.valueOf(mData.subSequence(0, mData.length() - 1));

            number10000 = new ChineseNumber10000(numberData);
            number1000 = new ChineseNumber1000(numberData = numberData.replace(number10000.getData(), ""));
            number100 = new ChineseNumber100(numberData = numberData.replace(number1000.getData(), ""));
            number10 = new ChineseNumber10(numberData = numberData.replace(number100.getData(), ""));
            number1 = new ChineseNumber1(numberData.replace(number10.getData(), ""));
        }
    }

    public long getNumber() {
        long number = number10000.getNumber() + number1000.getNumber() + number100.getNumber() + number10.getNumber() + number1.getNumber();
        return number * unit;
    }

    public String getData() {
        return mData;
    }
}



猜你喜欢

转载自blog.csdn.net/u014040795/article/details/70176259