本文實例講述了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程序設計有所幫助。