-
Notifications
You must be signed in to change notification settings - Fork 164
Expand file tree
/
Copy pathNumberToLetterConverter.java
More file actions
141 lines (124 loc) · 4.86 KB
/
NumberToLetterConverter.java
File metadata and controls
141 lines (124 loc) · 4.86 KB
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
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
/**
*
* @author roberta
*/
public abstract class NumberToLetterConverter {
private static final String[] UNITS = {"", "One ", "Two ", "Three ",
"Four ", "Five ", "Six ", "Seven ", "Eight ", "Nine ", "Ten ",
"Eleven ", "Twelve ", "Thirteen ", "Fourteen ", "Fifteen ", "Sixteen",
"Seventeen", "Eighteen", "Nineteen", "Twenty"};
private static final String[] TENS = {"Twenty", "Thirty ", "Forty ",
"Fifty ", "Sixty ", "Seventy ", "Eighty ", "Ninety ",
"One Hundred "};
private static final String[] HUNDREDS = {"One Hundred ", "Two Hundred ",
"Three Hundred ", "Four Hundred ", "Five Hundred ", "Six Hundred ",
"Seven Hundred ", "Eight Hundred ", "Nine Hundred "};
/**
* El número es válido si está entre 0 y 999.999.999
*/
public static String convertNumberToLetter(double number)
throws NumberFormatException {
String converted = new String();
// validate if a legal number
if (number < 0) {
throw new IllegalArgumentException("Can't convert negative numbers");
}
double doubleNumber = Math.rint(number * 100) / 100;
if (doubleNumber > 999999999) {
throw new NumberFormatException(
"The number is greater than 999.999.999, "
+ "isn't possible to convert");
}
String splitNumber[] = String.valueOf(doubleNumber).replace('.', '#').split("#");
// Descompone el trio de millones
int millon = Integer.parseInt(String.valueOf(getDigitAt(splitNumber[0],
8))
+ String.valueOf(getDigitAt(splitNumber[0], 7))
+ String.valueOf(getDigitAt(splitNumber[0], 6)));
if (millon == 1) {
converted = "A million ";
}
if (millon > 1) {
converted = convertNumber(String.valueOf(millon)) + "Millions ";
}
// Descompone el trio de miles -
int miles = Integer.parseInt(String.valueOf(getDigitAt(splitNumber[0],
5))
+ String.valueOf(getDigitAt(splitNumber[0], 4))
+ String.valueOf(getDigitAt(splitNumber[0], 3)));
if (miles == 1) {
converted += "One Thousand ";
}
if (miles > 1) {
converted += convertNumber(String.valueOf(miles)) + "Thousand ";
}
// Descompone el ultimo trio de unidades
int cientos = Integer.parseInt(String.valueOf(getDigitAt(
splitNumber[0], 2))
+ String.valueOf(getDigitAt(splitNumber[0], 1))
+ String.valueOf(getDigitAt(splitNumber[0], 0)));
if (cientos == 1) {
converted += "One";
}
if (millon + miles + cientos == 0) {
converted += "Zero dollars";
}
if (cientos > 1) {
converted += convertNumber(String.valueOf(cientos));
}
// Descompone los centavos
int centavos = Integer.parseInt(String.valueOf(getDigitAt(
splitNumber[1], 2))
+ String.valueOf(getDigitAt(splitNumber[1], 1))
+ String.valueOf(getDigitAt(splitNumber[1], 0)));
if (centavos == 1) {
converted += " With a cent";
}
if (centavos > 1) {
converted += "and " + centavos
+ "/100 Dollars";
}
return converted;
}
/**
* Convierte los trios de números que componen las unidades, las decenas y
* las centenas del número.
*/
private static String convertNumber(String number) {
if (number.length() > 3) {
throw new NumberFormatException(
"The maximum length must be 3 digits");
}
String output = new String();
if (getDigitAt(number, 2) != 0) {
output = HUNDREDS[getDigitAt(number, 2) - 1];
}
int k = Integer.parseInt(String.valueOf(getDigitAt(number, 1))
+ String.valueOf(getDigitAt(number, 0)));
if (k <= 20) {
output += UNITS[k];
} else {
if (k > 30 && getDigitAt(number, 0) != 0) {
output += TENS[getDigitAt(number, 1) - 2] + "And "
+ UNITS[getDigitAt(number, 0)];
} else {
output += TENS[getDigitAt(number, 1) - 2]
+ UNITS[getDigitAt(number, 0)];
}
}
// Caso especial con 100
if (getDigitAt(number, 2) == 1 && k == 0) {
output = "One Hundred";
}
return output;
}
/**
* Retorna el dígito numerico en la posición indicada de derecha a izquierda
*/
private static int getDigitAt(String origin, int position) {
if (origin.length() > position && position >= 0) {
return origin.charAt(origin.length() - position - 1) - 48;
}
return 0;
}
}