/**
* @description 大写转阿拉伯数字
* @author ycy
* @param cnTraditionalNum
*/
public static String method1(String cnTraditionalNum) {
//规范错误字符
cnTraditionalNum = cnTraditionalNum
.replaceAll("億", "亿")
.replaceAll("萬", "万")
.replaceAll("千", "仟")
.replaceAll("阡", "仟")
.replaceAll("百", "佰")
.replaceAll("元", "圆")
.replaceAll("圓", "圆")
;
long result = 0;
if (cnTraditionalNum.contains("亿")) {
String yi = cnTraditionalNum.substring(0, cnTraditionalNum.indexOf("亿"));
result += cnThousandNumberToArab(yi) * 100000000L;
cnTraditionalNum = cnTraditionalNum.substring(cnTraditionalNum.indexOf("亿"));
}
if (cnTraditionalNum.contains("万")) {
String wan = cnTraditionalNum.substring(0, cnTraditionalNum.indexOf("万"));
result += cnThousandNumberToArab(wan) * 10000L;
cnTraditionalNum = cnTraditionalNum.substring(cnTraditionalNum.indexOf("万"));
}
if (cnTraditionalNum.contains("圆")) {
String wan = cnTraditionalNum.substring(0, cnTraditionalNum.indexOf("圆"));
result += cnThousandNumberToArab(wan);
cnTraditionalNum = cnTraditionalNum.substring(cnTraditionalNum.indexOf("圆"));
}
//小数点后
String jiao = "0";
String fen = "0";
String resultStr = String.valueOf(result);
if (cnTraditionalNum.contains("角")) {
jiao = cnNumToArabicNumMap.get(cnTraditionalNum.substring(cnTraditionalNum.indexOf("角") - 1, cnTraditionalNum.indexOf("角"))).toString();
}
if (cnTraditionalNum.contains("分")) {
fen = cnNumToArabicNumMap.get(cnTraditionalNum.substring(cnTraditionalNum.indexOf("分") - 1, cnTraditionalNum.indexOf("分"))).toString();
}
resultStr += "." + jiao + fen;
return resultStr;
}
private static Map<String, Integer> cnNumToArabicNumMap;
static {
cnNumToArabicNumMap = new HashMap<>();
cnNumToArabicNumMap.put("零", 0);
cnNumToArabicNumMap.put("壹", 1);
cnNumToArabicNumMap.put("一", 1);
cnNumToArabicNumMap.put("贰", 2);
cnNumToArabicNumMap.put("貳", 2);
cnNumToArabicNumMap.put("二", 2);
cnNumToArabicNumMap.put("两", 2);
cnNumToArabicNumMap.put("叁", 3);
cnNumToArabicNumMap.put("参", 3);
cnNumToArabicNumMap.put("三", 3);
cnNumToArabicNumMap.put("四", 4);
cnNumToArabicNumMap.put("肆", 4);
cnNumToArabicNumMap.put("五", 5);
cnNumToArabicNumMap.put("伍", 5);
cnNumToArabicNumMap.put("陆", 6);
cnNumToArabicNumMap.put("六", 6);
cnNumToArabicNumMap.put("柒", 7);
cnNumToArabicNumMap.put("七", 7);
cnNumToArabicNumMap.put("八", 8);
cnNumToArabicNumMap.put("捌", 8);
cnNumToArabicNumMap.put("九", 9);
cnNumToArabicNumMap.put("玖", 9);
}
/**
* 将大写数字转换为阿拉伯数字(数字小于一万)
*/
private static long cnThousandNumberToArab(String number) {
int result = 0;
if (number.indexOf("拾") <= 0
|| !cnNumToArabicNumMap.containsKey(String.valueOf(number.charAt(number.indexOf("拾") - 1)))) {
number = number.replace("拾", "壹拾");
}
if (number.contains("仟")) {
result += getArabicValue(number.charAt(number.indexOf("仟") - 1)) * 1000;
}
if (number.contains("佰")) {
result += getArabicValue(number.charAt(number.indexOf("佰") - 1)) * 100;
}
if (number.contains("拾")) {
result += getArabicValue(number.charAt(number.indexOf("拾") - 1)) * 10;
}
if (cnNumToArabicNumMap.containsKey(number.substring(number.length() - 1))) {
result += cnNumToArabicNumMap.get(number.substring(number.length() - 1));
}
return result;
}
private static int getArabicValue(Character num) {
Integer result = cnNumToArabicNumMap.get(num.toString());
if (result == null)
throw new IllegalArgumentException("不支持将该中文字符[" + num + "]转换为阿拉伯数字!");
return result;
}
private static Pattern p1 = Pattern.compile("(\\d+)(\\.\\d+)?亿");
private static Pattern p21 = Pattern.compile("千万(\\d+)(\\.\\d+)?");
private static Pattern p22 = Pattern.compile("仟万(\\d+)(\\.\\d+)?");
private static Pattern p31 = Pattern.compile("(\\d+)(\\.\\d+)?千");
private static Pattern p32 = Pattern.compile("(\\d+)(\\.\\d+)?仟");
private static Pattern p2 = Pattern.compile("(\\d+)(\\.\\d+)?万");
private static Pattern p3 = Pattern.compile("(\\d+)(\\.\\d+)?元");
private static Pattern p4 = Pattern.compile("百万(\\d+)(\\.\\d+)?");
private static Pattern p5 = Pattern.compile("佰万(\\d+)(\\.\\d+)?");
private static Pattern p41 = Pattern.compile("(\\d+)(\\.\\d+)?百");
private static Pattern p42 = Pattern.compile("(\\d+)(\\.\\d+)?佰");
private static Pattern p51 = Pattern.compile("(\\d+)(\\.\\d+)?百万");
private static Pattern p52 = Pattern.compile("(\\d+)(\\.\\d+)?佰万");
private static Pattern p61 = Pattern.compile("(\\d+)(\\.\\d+)?千万");
private static Pattern p62 = Pattern.compile("(\\d+)(\\.\\d+)?仟万");
private static Pattern p7 = Pattern.compile("(\\d+)(\\.\\d+)?十万");
private static Pattern p8 = Pattern.compile("(\\d+)(\\.\\d+)?拾万");
private static Pattern p71 = Pattern.compile("十万(\\d+)(\\.\\d+)?");
private static Pattern p81 = Pattern.compile("拾万(\\d+)(\\.\\d+)?");
private static Pattern p9 = Pattern.compile("(\\d+)(\\.\\d+)?十");
private static Pattern p91 = Pattern.compile("(\\d+)(\\.\\d+)?拾");
/**
* @description 小写数字+汉字转成纯数字
* @author ycy
* @param s
*/
public static String method2(String s) throws Exception {
// String regex = "^[0-9]+(\\.[0-9]+)?[亿万元]+([0-9]+[亿万])?([0-9]+[元])?$";
// String regex = "^[0-9]+(\\.[0-9]+)?[亿万元]+([0-9]+[亿万])?([0-9]+[元])?$";
if (s.contains("整")){
s=s.replace("整","");
}
if (s.contains("人民币")){
s=s.replace("人民币","");
}
String regex = "(\\d+(\\.\\d+)?[亿|万|十|拾|千|仟|百|佰|十]*[元|万]?)+";
if(!s.matches(regex)){
throw new Exception();
}
Long sum = 0L;
//Pattern p1 = Pattern.compile("(\\d+)(\\.\\d+)?亿");
Matcher m1 = p1.matcher(s);
if (m1.find()) {
String num = m1.group(1);
sum = sum + Long.valueOf(num) * 100000000;
//System.out.println(num + "亿");
}
boolean containsQianWan = s.matches(".*千万.*");
boolean containsQian = s.matches(".*千(?!万).*");
boolean containsBoth = containsQianWan && containsQian;
boolean containsQianWanq = s.matches(".*仟万.*");
boolean containsQianq = s.matches(".*千(?!万).*");
boolean containsBothq = containsQianWanq && containsQianq;
boolean containsQianWanq1 = s.matches(".*千万.*");
boolean containsQianq1 = s.matches(".*仟(?!万).*");
boolean containsBothq1 = containsQianWanq1 && containsQianq1;
boolean containsQianWanq11 = s.matches(".*仟万.*");
boolean containsQianq11 = s.matches(".*仟(?!万).*");
boolean containsBothq11 = containsQianWanq11 && containsQianq11;
if (containsBoth || containsBothq || containsBothq1 || containsBothq11){
//Pattern p21 = Pattern.compile("千万(\\d+)(\\.\\d+)?");
Matcher m21 = p21.matcher(s);
if (m21.find()) {
String num = m21.group(1);
sum = sum + Long.valueOf(num) * 1000;
//System.out.println(num + "千");
}
//Pattern p22 = Pattern.compile("仟万(\\d+)(\\.\\d+)?");
Matcher m22 = p22.matcher(s);
if (m22.find()) {
String num = m22.group(1);
sum = sum + Long.valueOf(num) * 1000;
//System.out.println(num + "千");
}
}else if ((!s.matches(".*千万.*")) && !s.matches(".*仟万.*")){
//Pattern p31 = Pattern.compile("(\\d+)(\\.\\d+)?千");
Matcher m31 = p31.matcher(s);
if (m31.find()) {
String num = m31.group(1);
sum = sum + Long.valueOf(num) * 1000;
//System.out.println(num + "千");
}
//Pattern p32 = Pattern.compile("(\\d+)(\\.\\d+)?仟");
Matcher m32 = p32.matcher(s);
if (m32.find()) {
String num = m32.group(1);
sum = sum + Long.valueOf(num) * 1000;
//System.out.println(num + "千");
}
}
//Pattern p2 = Pattern.compile("(\\d+)(\\.\\d+)?万");
Matcher m2 = p2.matcher(s);
if (m2.find()) {
String num = m2.group(1);
sum = sum + Long.valueOf(num) * 10000;
//System.out.println(num + "万");
}
//Pattern p3 = Pattern.compile("(\\d+)(\\.\\d+)?元");
Matcher m3 = p3.matcher(s);
if (m3.find()) {
String num = m3.group(1);
sum = sum + Long.valueOf(num);
//System.out.println(num + "元");
}
boolean containsQianWan2 = s.matches(".*百万.*");
boolean containsQian2 = s.matches(".*百(?!万).*");
boolean containsBoth2 = containsQianWan2 && containsQian2;
boolean containsQianWan2q = s.matches(".*佰万.*");
boolean containsQian2q = s.matches(".*百(?!万).*");
boolean containsBoth2q = containsQianWan2q && containsQian2q;
boolean containsQianWan2q1 = s.matches(".*百万.*");
boolean containsQian2q1 = s.matches(".*佰(?!万).*");
boolean containsBoth2q1 = containsQianWan2q1 && containsQian2q1;
boolean containsQianWan2q11 = s.matches(".*佰万.*");
boolean containsQian2q11 = s.matches(".*佰(?!万).*");
boolean containsBoth2q11 = containsQianWan2q11 && containsQian2q11;
if (containsBoth2 || containsBoth2q || containsBoth2q1 || containsBoth2q11){
//Pattern p4 = Pattern.compile("百万(\\d+)(\\.\\d+)?");
Matcher m4 = p4.matcher(s);
if (m4.find()) {
String num = m4.group(1);
sum = sum + Long.valueOf(num) * 100;
//System.out.println(num + "百万");
}
//Pattern p5 = Pattern.compile("佰万(\\d+)(\\.\\d+)?");
Matcher m5 = p5.matcher(s);
if (m5.find()) {
String num = m5.group(1);
sum = sum + Long.valueOf(num) * 100;
//System.out.println(num + "百万");
}
}else if ((!s.matches(".*佰万.*")) && !s.matches(".*百万.*")){
//Pattern p41 = Pattern.compile("(\\d+)(\\.\\d+)?百");
Matcher m41 = p41.matcher(s);
if (m41.find()) {
String num = m41.group(1);
sum = sum + Long.valueOf(num) * 100;
//System.out.println(num + "百万");
}
//Pattern p42 = Pattern.compile("(\\d+)(\\.\\d+)?佰");
Matcher m42 = p42.matcher(s);
if (m42.find()) {
String num = m42.group(1);
sum = sum + Long.valueOf(num) * 100;
//System.out.println(num + "百万");
}
}
//Pattern p51 = Pattern.compile("(\\d+)(\\.\\d+)?百万");
Matcher m51 = p51.matcher(s);
if (m51.find()) {
String num = m51.group(1);
sum = sum + Long.valueOf(num) * 1000000;
//System.out.println(num + "百万");
}
//Pattern p52 = Pattern.compile("(\\d+)(\\.\\d+)?佰万");
Matcher m52 = p52.matcher(s);
if (m52.find()) {
String num = m52.group(1);
sum = sum + Long.valueOf(num) * 1000000;
//System.out.println(num + "百万");
}
//Pattern p61 = Pattern.compile("(\\d+)(\\.\\d+)?千万");
Matcher m61 = p61.matcher(s);
if (m61.find()) {
String num = m61.group(1);
sum = sum + Long.valueOf(num) * 10000000;
//System.out.println(num + "千万");
}
//Pattern p62 = Pattern.compile("(\\d+)(\\.\\d+)?仟万");
Matcher m62 = p62.matcher(s);
if (m62.find()) {
String num = m62.group(1);
sum = sum + Long.valueOf(num) * 10000000;
//System.out.println(num + "千万");
}
//Pattern p7 = Pattern.compile("(\\d+)(\\.\\d+)?十万");
Matcher m7 = p7.matcher(s);
if (m7.find()) {
String num = m7.group(1);
sum = sum + Long.valueOf(num) * 100000;
//System.out.println(num + "十万");
}
//Pattern p71 = Pattern.compile("(\\d+)(\\.\\d+)?拾万");
Matcher m8 = p8.matcher(s);
if (m8.find()) {
String num = m8.group(1);
sum = sum + Long.valueOf(num) * 100000;
//System.out.println(num + "十万");
}
boolean containsQianWan3 = s.matches(".*十万.*");
boolean containsQian3 = s.matches(".*十(?!万).*");
boolean containsBoth3 = containsQianWan3 && containsQian3;
boolean containsQianWan3q = s.matches(".*十万.*");
boolean containsQian3q = s.matches(".*拾(?!万).*");
boolean containsBoth3q = containsQianWan3q && containsQian3q;
boolean containsQianWan3q1 = s.matches(".*拾万.*");
boolean containsQian3q1 = s.matches(".*十(?!万).*");
boolean containsBoth3q1 = containsQianWan3q1 && containsQian3q1;
boolean containsQianWan3q11 = s.matches(".*拾万.*");
boolean containsQian3q11 = s.matches(".*拾(?!万).*");
boolean containsBoth3q11 = containsQianWan3q11 && containsQian3q11;
if (containsBoth3 || containsBoth3q || containsBoth3q1 || containsBoth3q11){
//Pattern p71 = Pattern.compile("十万(\\d+)(\\.\\d+)?");
Matcher m71 = p71.matcher(s);
if (m71.find()) {
String num = m71.group(1);
sum = sum + Long.valueOf(num) * 10;
//System.out.println(num + "十万");
}
//Pattern p81 = Pattern.compile("拾万(\\d+)(\\.\\d+)?");
Matcher m81 = p81.matcher(s);
if (m81.find()) {
String num = m81.group(1);
sum = sum + Long.valueOf(num) * 10;
//System.out.println(num + "十万");
}
}else if((!s.matches(".*十万.*")) && !s.matches(".*拾万.*")){
//Pattern p9 = Pattern.compile("(\\d+)(\\.\\d+)?十");
Matcher m9 = p9.matcher(s);
if (m9.find()) {
String num = m9.group(1);
sum = sum + Long.valueOf(num) * 10;
//System.out.println(num + "十");
}
//Pattern p91 = Pattern.compile("(\\d+)(\\.\\d+)?拾");
Matcher m91 = p91.matcher(s);
if (m91.find()) {
String num = m91.group(1);
sum = sum + Long.valueOf(num) * 10;
//System.out.println(num + "十");
}
}
return sum.toString()+".00";
}
public static String method(String s) throws Exception {
String test = "";
// 是否全汉字
if (s.matches("^[\\u4e00-\\u9fa5]+$")){
return method1(s);
}else{
//调用方法二,方法二会判断是否符合b的条件,不符合就抛异常
try {
return method2(s);
}catch (Exception e){
return "请检查输入金额";
}
}
}
public static void main(String[] args) throws Exception {
String a = "8千万5角6分";
String method = method(a);
System.out.println(method);
}
金额转换,两千万、2000万转成20000000.00
于 2023-06-12 10:07:29 首次发布