汉语数字转化为阿拉伯数字
方式一:得到结果集然后进行遍历
public static void main(String[] args) {
List<String> kk = new ArrayList<String>();
kk.add("一");
kk.add("五");
kk.add("一十三");
kk.add("十");
kk.add("十三");
kk.add("二百");
kk.add("一百五");
kk.add("一百五十");
kk.add("一千五");
kk.add("一千五百");
kk.add("一万零五百");
kk.add("一万五");
kk.add("一万五千");//
kk.add("一万零五十");
kk.add("一万零五");
kk.add("一千零五");
kk.add("九千九百九十九");
for (String str : kk) {
String oo = initNumToInt(str);
System.out.println(str+ ":"+oo);
System.err.println(str+ ":"+dsd.chineseToInt(str));
}
}
public static String initNumToInt(String str) {
char chinaNum[] = {'一','二','三','四','五','六','七','八','九','十'};
int matheNum[] = {1,2,3,4,5,6,7,8,9,0};
String chinaNumUnit[] = {"零","十","百","千","万"};
int moveNum[] = {0,1,2,3,4};
for(int i=0;i<chinaNumUnit.length;i++) { //初始化str
if(str.startsWith(chinaNumUnit[i])) {
str = "一"+str;
break;
}else if(str.length()>2&&i>1 ){
if(chinaNumUnit[i].equals(String.valueOf(str.charAt(str.length()-2)))) {
str = str+chinaNumUnit[i-1];
break;
}
}
}
List<Integer> list = new ArrayList<Integer>();
char cha = '0';
int result = 0;
for(int i=0;i<str.length();i++) {
cha = str.charAt(i);//
ok:for(int j=0;j<chinaNum.length;j++) {
if(cha==chinaNum[j]) {
int num = matheNum[j];
if(list.size()==0) {
list.add(num);
}else {
list.set(0, num);
}
}
//移动
if(list.size()!=0) {
for(int k=0;k<chinaNumUnit.length;k++) {
if(cha==chinaNumUnit[k].charAt(0)) {
int a = list.size();
if(a<=moveNum[k]) {
for(int size=0;size<moveNum[k];size++) {
list.add(0);
}
}
list.set(moveNum[k], list.get(0));
list.set(0, 0);
break ok;
}else {
continue;
}
}
}
}
}
for(int i=0;i<list.size();i++) {//遍历方式一
int multiple=1;
for(int k=1;k<=i;k++) {
multiple = multiple * 10;
}
result += list.get(i)*multiple;
}
String newStr="";
for(int i=0;i<list.size();i++) {//遍历方式二
newStr +=list.get(list.size()-1-i);
}
return result+"";
}
运行结果展示
以上方式暂时无法处理十万以上的数字
方式二:结果集一直变化中
public class Dsd {
public static int chineseToInt(String str) {
Map<Character,Integer> map = new HashMap<>();
map.put('一', 1);
map.put('二', 2);
map.put('三', 3);
map.put('四', 4);
map.put('五', 5);
map.put('六', 6);
map.put('七', 7);
map.put('八', 8);
map.put('九', 9);
map.put('十', 10);
map.put('百', 100);
map.put('千', 1000);
map.put('万', 10000);
str = str.replaceAll("零", "");
int[] nums = new int[str.length()+1];
int nm = 0;
for(int i = 0;i<str.length();i++) {
nums[i] = map.get(str.charAt(i));
if(i!=0&&nums[i]>=10) {
if(nums[i-1]<10){
nm += nums[i]*nums[i-1]-nums[i-1];
}else {
nm *= nums[i];
}
}else {
nm += nums[i];
}
}
return nm;
}
}
运行结果展示
以上方式暂时处理结果,克服了第一种方式的短板
方式二在结果上出现了一部分的误差,只需在调用方法之前调用初始化str的方法即可
罗马数字转化为阿拉伯数字
public static void main(String[] args) {
List<String> kk = new ArrayList<String>();
kk.add("III");//3
kk.add("IX");//9
kk.add("XXIX");//29
kk.add("XI"); //11
kk.add("CMXCIX");//999
kk.add("MDCCCXCIX");//1899
kk.add("MDCLXVI");//1666
kk.add("C");//100
kk.add("LX");//60
kk.add("XCVIII");//98
for (String str : kk) {
System.out.println(str+":"+romanToInt(str));
}
}
public static int romanToInt(String s) {
int nm = 0;
int[] nums = new int[s.length()+1];
char[] cs = s.toCharArray();
for(int i = 1;i<=cs.length;i++) {
switch (cs[cs.length-i]) {
case 'I':
nums[i] = 1;
break;
case 'V':
nums[i] = 5;
break;
case 'X':
nums[i] = 10;
break;
case 'L':
nums[i] = 50;
break;
case 'C':
nums[i] = 100;
break;
case 'D':
nums[i] = 500;
break;
default:
nums[i] = 1000;
break;
}
if(nums[i]>=nums[i-1]) {
nm += nums[i];
}else {
nm -= nums[i];
}
}
return nm;
}
运行结果展示
有出入的地方欢迎指正,有好的方案欢迎交流,代码中有很多不足的地方还望见谅