java读取字符串的数字_Java解析中文数字字符串

public class ChineseNumberParsing {

// 通过中文数字字符,在该字符串中查找其对应的数值或其表示的数位

// 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14

// 零 一 二 三 四 五 六 七 八 九 十 百 千 万 亿

private static final String dic = "零一二三四五六七八九十百千万亿";

// 反向的数字模板

private static final String model = "个十百千万十百千亿十百千";

/**

* 解析中文数字字符串,获取它所表示的数值

*

* @param numberZhString

*            中文数字字符串

* @return 中文数字字符串所代表的数值

*/

public static long parseLong(String numberZhString) {

if (numberZhString == "") {

return 0;

}

// 将传入的中文数字字符串倒置 eg.五千万零九百零三 -> 三零百九零万千五

numberZhString = new StringBuffer(numberZhString).reverse().toString();

// 声明一个数组,与反向的数字模板对应

char[] resultChars = new char[12];

// 将结果字符数组使用字符0初始化

for (int i = 0; i < resultChars.length; i++) {

resultChars[i] = '0';

}

// i -- 用来遍历numberZhString的数组下标

// j -- 用来访问resultChars的数组下标

for (int i = 0, j = 0; i < numberZhString.length(); i++) {

// 依次取出numberZhString中的字符,如三,零,百,千

char c = numberZhString.charAt(i);

// 查找字符c所对应的数值或表示的数位

// 如:三对应3,百对应11代表百位或百万位或百亿位

int t = dic.indexOf(c);

// 如果字符c代表一个数值,将该数值转化为数字字符,并存入resultChars.

if (t >= 1 && t <= 9) {

resultChars[j] = (char) (t + '0');

}

// 如果字符c代表一个数位,移动resultChars的数组下标j

else if (t >= 10 && t <= 14) {

j = model.indexOf(c, j);

}

// 如果字符c代表0,什么也不做

else if (t == 0) {

}

// 否则,抛出运行期异常

else {

throw new RuntimeException("中文数字字符串包含非法字符!只能包含以下字符:"

+ "零、一、二、三、四、五、六、七、八、九、十、百、千、万、亿");

}

}

// 获取resultChars的字符串形式

String resultString = String.copyValueOf(resultChars);

// 将该字符串倒置

resultString = new StringBuffer(resultString).reverse().toString();

// 将该字符串解析为long返回

return Long.parseLong(resultString);

}

/**

* 返回长整数l的中文表示形式

*/

public static String toString(long l) {

String numberString = Long.toString(l);

numberString = new StringBuffer(numberString).reverse().toString();

char[] resultChars = new char[12];

for (int i = 0; i < resultChars.length; i++) {

resultChars[i] = '零';

}

for (int i = 0; i < numberString.length(); i++) {

resultChars[i] = dic.charAt(numberString.charAt(i) - '0');

}

StringBuffer resultStringBuffer = new StringBuffer(20);

for (int i = 0; i < numberString.length(); i++) {

if (i == 4) {

resultStringBuffer.append('万');

}

if (i == 8) {

resultStringBuffer.append('亿');

}

if (resultChars[i] != '零') {

if (i == 4 || i == 8) {

resultStringBuffer.append(resultChars[i]);

} else {

resultStringBuffer.append("" + model.charAt(i)

+ resultChars[i]);

}

} else {

if (resultStringBuffer.charAt(resultStringBuffer.length() - 1) != '零'

&& resultStringBuffer.charAt(resultStringBuffer

.length() - 1) != '万'

&& resultStringBuffer.charAt(resultStringBuffer

.length() - 1) != '亿') {

resultStringBuffer.append('零');

}

}

}

resultStringBuffer.deleteCharAt(0);

resultStringBuffer.reverse();

return resultStringBuffer.toString();

}

public static void main(String[] args) {

System.out.println(ChineseNumberParsing.parseLong("九百零三"));

System.out.println(ChineseNumberParsing.toString(907300250302L));

}

}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值