先是把大写数字理解为数值与单位
然后先考虑转换数值,确定了数值,再考虑单位,该位置值即为数值*单位
每次累加即可。
直接上代码把,对应的地方都有注释解释
@Test
public void t2() {
List<String> strings = Lists.newArrayList("二十五", "一百零三", "四百五十五", "三百六十", "三十", "五千零三十二");
strings.sort((o1, o2) -> chinese2int(o1) - chinese2int(o2));
System.out.println(strings);
//25 30 103 360 455 5032
//[二十五, 三十, 一百零三, 三百六十, 四百五十五, 五千零三十二]
}
/**
* 默认都是正数
* 只支持10万以内的数值转换
* @param chinese
* @return
*/
private Integer chinese2int(String chinese) {
String aval = "零一二三四五六七八九";
String bval = "十百千万";
int num = 0;
char[] array = chinese.toCharArray();
for (int ii = 0; ii < array.length; ii++) {
char c = array[ii];
//判断是否为0123456789
if (aval.contains(String.valueOf(c))) {
char[] chars = aval.toCharArray();
for (int i = 0; i < chars.length; i++) {
if (chars[i] == c) {
//判断后面一位的单位,如果包含,则说明有单位,则num为i*对应的单位 否则为个,
if (ii + 1 < array.length && bval.contains(String.valueOf(array[ii + 1]))) {
char[] chars2 = bval.toCharArray();
for (int j = 0; j < chars2.length; j++) {
if (chars2[j] == array[ii + 1]) {
num += i * Math.pow(10, j + 1);
break;
}
}
} else {
num += i;
}
break;
}
}
}
}
return num;
}
有不对的地方欢迎评论区交流,互相学习。