例如:
1。控制台输入:一万三千零四十加二减一十.....(注意:项数不定) 控制台输出:一万三千零三十二
2。输入:二十加一百乘二除五十减四 ........(注意:项数不定) 控制台输出:二十
3.。输入:(一百一十一加九)乘 (五加九十五)....... (注意:项数不定)控制台输出:一万二
1。控制台输入:一万三千零四十加二减一十.....(注意:项数不定) 控制台输出:一万三千零三十二
2。输入:二十加一百乘二除五十减四 ........(注意:项数不定) 控制台输出:二十
3.。输入:(一百一十一加九)乘 (五加九十五)....... (注意:项数不定)控制台输出:一万二
解决方案 »
- 咨询一问题:httpclient 多线程如何监控页面是否改变呢?
- 一个把我卡住的问题,关于图形界面的。
- 有谁有java 用TCP传输文件的例子,发给我一份
- 在JScrollPane里面加入JTable问题
- 怎么样把java 编译成exe文件那样的
- 想和CSDN上各位大侠讨论一下关于UTF-8编码转化的问题.
- 转贴,我也遇到的问题.Jdk1.4.1新的焦点控制系统的问题?
- 又问高手:关于鼠标对图形的点击捕捉!
- 关于JNI的中文问题(急急急急急)
- 请问哪儿有JavaTM 2 Platform, Standard Edition v 1.3.1 下载??高分相赠!
- org.json.JSONObject 实在太弱
- system.out.print的问题
import java.util.regex.Matcher;
import java.util.regex.Pattern;//假设在汉译有效的情况下.
public class Test{
public static void main(String[] args){
String[] contents = {"一万三千零四十加二减一十","二十加一百乘二除五十减四","(一百一十一加九)乘 (五加九十五)"};
String result = null;
for(String content : contents){
result = process(content);
System.out.printf("'%s' = '%s' \n",content,result);
} String content = "一万五千六百零二乘以五十八减六十六乘以九十"; System.out.printf("'%s' = '%s' \n",content,process(content)); } private static String process(String content){
String arabic = chineseToArabic(content);
String result = processWithParenthese(arabic);
result = arabicToChinese(result);
return result;
} private static String chineseToArabic(String chinese){
//去除空格,替换中文括号为英文括号
chinese = chinese.replaceAll("\\s+","");
chinese = chinese.replaceAll("(","(");
chinese = chinese.replaceAll(")",")"); chinese = chinese.replaceAll("加以?","+");
chinese = chinese.replaceAll("减以?","-");
chinese = chinese.replaceAll("乘以?","*");
chinese = chinese.replaceAll("除以?","/");
chinese = chinese.replaceAll("[一壹]","1");
chinese = chinese.replaceAll("[二贰]","2");
chinese = chinese.replaceAll("[三叁]","3");
chinese = chinese.replaceAll("[四肆]","4");
chinese = chinese.replaceAll("[五伍]","5");
chinese = chinese.replaceAll("[六陆]","6");
chinese = chinese.replaceAll("[七柒]","7");
chinese = chinese.replaceAll("[八捌]","8");
chinese = chinese.replaceAll("[九玖]","9");
chinese = chinese.replaceAll("零","0");
//仅处理一万以内的数字(正整数)
chinese = chinese.replaceAll("[万千仟百佰十拾](?!0)(?=\\d)","");
chinese = chinese.replaceAll("万0(?=\\d[百佰])","0");
chinese = chinese.replaceAll("万0(?=\\d[十拾])","00");
chinese = chinese.replaceAll("万0(?=\\d([-+*/]|$))","000"); chinese = chinese.replaceAll("[千仟]0(?=\\d[十拾])","0");
chinese = chinese.replaceAll("[千仟]0(?=\\d([-+*/]|$))","00");
chinese = chinese.replaceAll("[千仟](?=[-+*/]|$)","000"); chinese = chinese.replaceAll("[百佰]0","0");
chinese = chinese.replaceAll("[百佰](?=[-+*/]|$)","00"); chinese = chinese.replaceAll("[十拾]","0"); assert chinese.matches("[-+*/0-9()]+");
return chinese;
} private static String arabicToChinese(String arabic){
arabic = arabic.replaceAll("^-","负");
arabic = arabic.replaceAll("(?<=\\d)(?=(\\d{4})+$)",",");
String[] tokens = {"万","亿","兆"};//结果仅处理到兆等量级
for(int i = 0 ; i < tokens.length ; i ++){
arabic = arabic.replaceAll(",(?!.*,)",tokens[i]);
}
arabic = arabic.replaceAll("(?<=[1-9])(?=\\d{3})","千");
arabic = arabic.replaceAll("(?<=[1-9])(?=\\d{2})","百");
arabic = arabic.replaceAll("(?<=[1-9])(?=\\d)","十");
arabic = arabic.replaceAll("0+(?=[万亿兆]|$)","");
arabic = arabic.replaceAll("0+","0");
String[] capitalNumbers = {"零","壹","贰","叁","肆","伍","陆","柒","捌","玖"};
for(int i = 0 ; i < capitalNumbers.length ; i ++){
arabic = arabic.replaceAll(i+"",capitalNumbers[i]);
}
return arabic;
} private static String processWithParenthese(String equation){
String regex = "(?<=[(])(?<middle>[^)]+)(?=[)])";
Pattern pattern = Pattern.compile(regex);
Matcher matcher = pattern.matcher(equation);
String middle = null;
String result = null;
while(matcher.find()){
middle = matcher.group("middle");
result = processWithoutParenthese(middle);
equation = equation.substring(0,matcher.start() - 1) + result + equation.substring(matcher.end() + 1 , equation.length());
matcher = pattern.matcher(equation);
} return processWithoutParenthese(equation);
}
//假设只存在小括号影响算式顺序.
private static String processWithoutParenthese(String equation){
//处理不带括号的情况
String regex = "(?<arg1>\\d+)(?<sign>[*/])(?<arg2>\\d+)";
Pattern pattern = Pattern.compile(regex);
Matcher matcher = pattern.matcher(equation);
int arg1 = 0;
int arg2 = 0;
String sign = null;
int result = 0;
//处理乘除法
while(matcher.find()){
sign = matcher.group("sign");
arg1 = Integer.valueOf(matcher.group("arg1"));
arg2 = Integer.valueOf(matcher.group("arg2"));
if(sign.equals("*")){
result = arg1 * arg2;
}else{
result = arg1 / arg2;//这里不算小数. 3/2=1
}
equation = equation.substring(0,matcher.start()) + result + equation.substring(matcher.end(),equation.length());
matcher = pattern.matcher(equation);
} //处理加减
regex = "(?<arg1>\\d+)(?<sign>[-+])(?<arg2>-?\\d+)";//两个数相减可能存在 5-7 = -2的情况.需要考虑进来
pattern = Pattern.compile(regex);
matcher = pattern.matcher(equation);
while(matcher.find()){
sign = matcher.group("sign");
arg1 = Integer.valueOf(matcher.group("arg1"));
arg2 = Integer.valueOf(matcher.group("arg2"));
if(sign.equals("+")){
result = arg1 + arg2;
}else{
result = arg1 - arg2;
}
equation = equation.substring(0,matcher.start()) + result + equation.substring(matcher.end(),equation.length());
matcher = pattern.matcher(equation);
} return equation;
}
}
import java.util.regex.Pattern;//假设在汉译有效的情况下.
public class Test{
public static void main(String[] args){
String[] contents = {"一万三千零四十加二减一十","二十加一百乘二除五十减四","(一百一十一加九)乘 (五加九十五)"};
String result = null;
for(String content : contents){
result = process(content);
System.out.printf("'%s' = '%s' \n",content,result);
}
String content = "一万五千六百零二乘以五十八减六十六乘以九十";
System.out.printf("'%s' = '%s' \n",content,process(content));
} private static String process(String content){
String arabic = chineseToArabic(content);
String result = processWithParenthese(arabic);
result = arabicToChinese(result);
return result;
} private static String chineseToArabic(String chinese){
//去除空格,替换中文括号为英文括号
chinese = chinese.replaceAll("\\s+","");
chinese = chinese.replaceAll("(","(");
chinese = chinese.replaceAll(")",")"); chinese = chinese.replaceAll("加以?","+");
chinese = chinese.replaceAll("减以?","-");
chinese = chinese.replaceAll("乘以?","*");
chinese = chinese.replaceAll("除以?","/");
chinese = chinese.replaceAll("[一壹]","1");
chinese = chinese.replaceAll("[二贰]","2");
chinese = chinese.replaceAll("[三叁]","3");
chinese = chinese.replaceAll("[四肆]","4");
chinese = chinese.replaceAll("[五伍]","5");
chinese = chinese.replaceAll("[六陆]","6");
chinese = chinese.replaceAll("[七柒]","7");
chinese = chinese.replaceAll("[八捌]","8");
chinese = chinese.replaceAll("[九玖]","9");
chinese = chinese.replaceAll("零","0");
//仅处理一万以内的数字(正整数)
chinese = chinese.replaceAll("[万千仟百佰十拾](?!0)(?=\\d)","");
chinese = chinese.replaceAll("万0(?=\\d[百佰])","0");
chinese = chinese.replaceAll("万0(?=\\d[十拾])","00");
chinese = chinese.replaceAll("万0(?=\\d([-+*/)]|$))","000"); chinese = chinese.replaceAll("[千仟]0(?=\\d[十拾])","0");
chinese = chinese.replaceAll("[千仟]0(?=\\d([-+*/)]|$))","00");
chinese = chinese.replaceAll("[千仟](?=[-+*/)]|$)","000"); chinese = chinese.replaceAll("[百佰]0","0");
chinese = chinese.replaceAll("[百佰](?=[-+*/)]|$)","00"); chinese = chinese.replaceAll("[十拾]","0"); assert chinese.matches("[-+*/0-9()]+");
return chinese;
} private static String arabicToChinese(String arabic){
arabic = arabic.replaceAll("^-","负");
arabic = arabic.replaceAll("(?<=\\d)(?=(\\d{4})+$)",",");
String[] tokens = {"万","亿","兆"};//结果仅处理到兆等量级
for(int i = 0 ; i < tokens.length ; i ++){
arabic = arabic.replaceAll(",(?!.*,)",tokens[i]);
}
arabic = arabic.replaceAll("(?<=[1-9])(?=\\d{3})","千");
arabic = arabic.replaceAll("(?<=[1-9])(?=\\d{2})","百");
arabic = arabic.replaceAll("(?<=[1-9])(?=\\d)","十");
arabic = arabic.replaceAll("0+(?=[万亿兆]|$)","");
arabic = arabic.replaceAll("0+","0");
String[] capitalNumbers = {"零","壹","贰","叁","肆","伍","陆","柒","捌","玖"};
for(int i = 0 ; i < capitalNumbers.length ; i ++){
arabic = arabic.replaceAll(i+"",capitalNumbers[i]);
}
return arabic;
} private static String processWithParenthese(String equation){
String regex = "(?<=[(])(?<middle>[^)]+)(?=[)])";
Pattern pattern = Pattern.compile(regex);
Matcher matcher = pattern.matcher(equation);
String middle = null;
String result = null;
while(matcher.find()){
middle = matcher.group("middle");
result = processWithoutParenthese(middle);
equation = equation.substring(0,matcher.start() - 1) + result + equation.substring(matcher.end() + 1 , equation.length());
matcher = pattern.matcher(equation);
}
return processWithoutParenthese(equation);
}
//假设只存在小括号影响算式顺序.
private static String processWithoutParenthese(String equation){
//处理不带括号的情况
String regex = "(?<arg1>\\d+)(?<sign>[*/])(?<arg2>-?\\d+)";
Pattern pattern = Pattern.compile(regex);
Matcher matcher = pattern.matcher(equation);
int arg1 = 0;
int arg2 = 0;
String sign = null;
int result = 0;
//处理乘除法
while(matcher.find()){
sign = matcher.group("sign");
arg1 = Integer.valueOf(matcher.group("arg1"));
arg2 = Integer.valueOf(matcher.group("arg2"));
if(sign.equals("*")){
result = arg1 * arg2;
}else{
result = arg1 / arg2;//这里不算小数. 3/2=1
}
equation = equation.substring(0,matcher.start()) + result + equation.substring(matcher.end(),equation.length());
matcher = pattern.matcher(equation);
} //处理加减
regex = "(?<arg1>\\d+)(?<sign>[-+])(?<arg2>-?\\d+)";//两个数相减可能存在 5-7 = -2的情况.需要考虑进来
pattern = Pattern.compile(regex);
matcher = pattern.matcher(equation);
while(matcher.find()){
sign = matcher.group("sign");
arg1 = Integer.valueOf(matcher.group("arg1"));
arg2 = Integer.valueOf(matcher.group("arg2"));
if(sign.equals("+")){
result = arg1 + arg2;
}else{
result = arg1 - arg2;
}
equation = equation.substring(0,matcher.start()) + result + equation.substring(matcher.end(),equation.length());
matcher = pattern.matcher(equation);
} return equation;
}
}
group报错