本文实例讲述了Java实现数字转成英文的方法。分享给大家供大家参考。具体分析如下:
英文数词,按3位3位区分
1
2
3
4
5
6
7
8
9
|
Hundred: 100 Thousand: 1 , 000 Million: 1 , 000 , 000 Billion: 1 , 000 , 000 , 000 Trillion: 1 , 000 , 000 , 000 , 000 Quintillion: 1 , 000 , 000 , 000 , 000 , 000 , 000 Sextillion: 1 , 000 , 000 , 000 , 000 , 000 , 000 , 000 Nonillion: 1 , 000 , 000 , 000 , 000 , 000 , 000 , 000 , 000 , 000 , 000 Centillion: 1 followed by 303 zeros |
所以把数字字符串按3位分割,分别解析
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
|
public class NumUtil { public static final String[] enNum = { // 基本数词表 "zero" , "one" , "tow" , "three" , "four" , "five" , "six" , "seven" , "eight" , "nine" , "ten" , "eleven" , "twelve" , "thirteen" , "fourteen" , "fifteen" , "sixteen" , "seventeen" , "eighteen" , "nineteen" , "twenty" , "" , "" , "" , "" , "" , "" , "" , "" , "" , "thirty" , "" , "" , "" , "" , "" , "" , "" , "" , "" , "fourty" , "" , "" , "" , "" , "" , "" , "" , "" , "" , "fifty" , "" , "" , "" , "" , "" , "" , "" , "" , "" , "sixty" , "" , "" , "" , "" , "" , "" , "" , "" , "" , "seventy" , "" , "" , "" , "" , "" , "" , "" , "" , "" , "eighty" , "" , "" , "" , "" , "" , "" , "" , "" , "" , "ninety" }; public static final String[] enUnit = { "hundred" , "thousand" , "million" , "billion" , "trillion" , "quintillion" }; // 单位表 public static void main(String[] args) { System.out.println(analyze( 1 )); // 测试数据 System.out.println(analyze( 21 )); System.out.println(analyze( 105 )); System.out.println(analyze( 3250 )); System.out.println(analyze( 47826 )); System.out.println(analyze( 56945781 )); } public static String analyze( long num) { // long型参数, return analyze(String.valueOf(num)); // 因为long型有极限,所以以字符串参数方法为主 } public static String analyze(String num) { // 数字字符串参数 // 判断字符串是否为数字 if (!num.matches( "\\d+" )) { return String.format( "%s is not number" , num); } num = num.replaceAll( "^[0]*([1-9]*)" , "$1" ); // 把字符串前面的0去掉 if (num.length() == 0 ) { // 如果长度为0,则原串都是0 return enNum[ 0 ]; } else if (num.length() > 9 ) { // 如果大于9,即大于999999999,题目限制条件 return "too big" ; } // 按3位分割分组 int count = (num.length() % 3 == 0 ) ? num.length() / 3 : num.length() / 3 + 1 ; if (count > enUnit.length) { return "too big" ; } // 判断组单位是否超过, // 可以根据需求适当追加enUnit String[] group = new String[count]; for ( int i = num.length(), j = group.length - 1 ; i > 0 ; i -= 3 ) { group[j--] = num.substring(Math.max(i - 3 , 0 ), i); } StringBuilder buf = new StringBuilder(); // 结果保存 for ( int i = 0 ; i < count; i++) { // 遍历分割的组 int v = Integer.valueOf(group[i]); if (v >= 100 ) { // 因为按3位分割,所以这里不会有超过999的数 buf.append(enNum[v / 100 ]).append( " " ).append(enUnit[ 0 ]) .append( " " ); v = v % 100 ; // 获取百位,并得到百位以后的数 if (v != 0 ) { buf.append( "and " ); } // 如果百位后的数不为0,则追加and } if (v != 0 ) { // 前提是v不为0才作解析 if (v < 20 || v % 10 == 0 ) { // 如果小于20或10的整数倍,直接取基本数词表的单词 buf.append(enNum[v]).append( " " ); } else { // 否则取10位数词,再取个位数词 buf.append(enNum[v - v % 10 ]).append( " " ); buf.append(enNum[v % 10 ]).append( " " ); } if (i != count - 1 ) { // 百位以上的组追加相应的单位 buf.append(enUnit[count - 1 - i]).append( " " ); } } } return buf.toString().trim(); // 返回值 } } |
希望本文所述对大家的java程序设计有所帮助。