I have been assigned to a task about Translating Numbers to Arabic Words in Arabic called "التفقيط".
The assignment was to build a simple Java class that contains the business logic.
I have finished it and hope it will be useful for all.
The Code:
package tafqeet;
public class TafqeetMain {
public TafqeetMain() {
}
final private static String[] units = { "Zero", "One", "Two", "Three", "Four", "Five", "Six", "Seven", "Eight",
"Nine", "Ten", "Eleven", "Twelve", "Thirteen", "Fourteen", "Fifteen", "Sixteen", "Seventeen", "Eighteen",
"Nineteen" };
final private static String[] tens = { "", "", "Twenty", "Thirty", "Forty", "Fifty", "Sixty", "Seventy", "Eighty",
"Ninety" };
private static String convert(Integer number) {
if (number < 20) {
return units[number];
}
if (number < 100) {
return tens[number / 10] + ((number % 10 > 0) ? " " + convert(number % 10) : "");
}
if (number < 1000) {
return units[number / 100] + " Hundred" + ((number % 100 > 0) ? " and " + convert(number % 100) : "");
}
if (number < 1000000) {
return convert(number / 1000) + " Thousand " + ((number % 1000 > 0) ? " " + convert(number % 1000) : "");
}
return convert(number / 1000000) + " Million "
+ ((number % 1000000 > 0) ? " " + convert(number % 1000000) : "");
}
public static String convertNumberToEnglishWords(String number) throws NumberFormatException {
Integer i = Integer.parseInt(number);
return convert(i);
}
public static String convertNumberToArabicWords(String number) throws NumberFormatException {
// check if the input string is number or not
Double.parseDouble(number);
// check if its floating point number or not
if (number.contains(".")) { // yes
// the number
String theNumber = number.substring(0, number.indexOf('.'));
// the floating point number
String theFloat = number.substring(number.indexOf('.') + 1);
// check how many digits in the number 1:x 2:xx 3:xxx 4:xxxx 5:xxxxx
// 6:xxxxxx
switch (theNumber.length()) {
case 1:
return convertOneDigits(theNumber) + " فاصلة " + convertTwoDigits(theFloat);
case 2:
return convertTwoDigits(theNumber) + " فاصلة " + convertTwoDigits(theFloat);
case 3:
return convertThreeDigits(theNumber) + " فاصلة " + convertTwoDigits(theFloat);
case 4:
return convertFourDigits(theNumber) + " فاصلة " + convertTwoDigits(theFloat);
case 5:
return convertFiveDigits(theNumber) + " فاصلة " + convertTwoDigits(theFloat);
case 6:
return convertSixDigits(theNumber) + " فاصلة " + convertTwoDigits(theFloat);
default:
return "";
}
}
else {
switch (number.length()) {
case 1:
return convertOneDigits(number);
case 2:
return convertTwoDigits(number);
case 3:
return convertThreeDigits(number);
case 4:
return convertFourDigits(number);
case 5:
return convertFiveDigits(number);
case 6:
return convertSixDigits(number);
default:
return "";
}
}
}
// -------------------------------------------
private static String convertOneDigits(String oneDigit) {
switch (Integer.parseInt(oneDigit)) {
case 1:
return "واحد";
case 2:
return "إثنان";
case 3:
return "ثلاثه";
case 4:
return "أربعه";
case 5:
return "خمسه";
case 6:
return "سته";
case 7:
return "سبعه";
case 8:
return "ثمانيه";
case 9:
return "تسعه";
default:
return "";
}
}
private static String convertTwoDigits(String twoDigits) {
String returnAlpha = "00";
// check if the first digit is 0 like 0x
if (twoDigits.charAt(0) == '0' && twoDigits.charAt(1) != '0') { // yes
// convert two digits to one
return convertOneDigits(String.valueOf(twoDigits.charAt(1)));
} else { // no
// check the first digit 1x 2x 3x 4x 5x 6x 7x 8x 9x
switch (getIntVal(twoDigits.charAt(0))) {
case 1: { // 1x
if (getIntVal(twoDigits.charAt(1)) == 1) {
return "إحدى عشر";
}
if (getIntVal(twoDigits.charAt(1)) == 2) {
return "إثنى عشر";
} else {
return convertOneDigits(String.valueOf(twoDigits.charAt(1))) + " " + "عشر";
}
}
case 2: // 2x x:not 0
returnAlpha = "عشرون";
break;
case 3: // 3x x:not 0
returnAlpha = "ثلاثون";
break;
case 4: // 4x x:not 0
returnAlpha = "أريعون";
break;
case 5: // 5x x:not 0
returnAlpha = "خمسون";
break;
case 6: // 6x x:not 0
returnAlpha = "ستون";
break;
case 7: // 7x x:not 0
returnAlpha = "سبعون";
break;
case 8: // 8x x:not 0
returnAlpha = "ثمانون";
break;
case 9: // 9x x:not 0
returnAlpha = "تسعون";
break;
default:
returnAlpha = "";
break;
}
}
// 20 - 99
// x0 x:not 0,1
if (convertOneDigits(String.valueOf(twoDigits.charAt(1))).length() == 0) {
return returnAlpha;
} else { // xx x:not 0
return convertOneDigits(String.valueOf(twoDigits.charAt(1))) + " و " + returnAlpha;
}
}
private static String convertThreeDigits(String threeDigits) {
// check the first digit x00
switch (getIntVal(threeDigits.charAt(0))) {
case 1: { // 100 - 199
if (getIntVal(threeDigits.charAt(1)) == 0) { // 10x
if (getIntVal(threeDigits.charAt(2)) == 0) { // 100
return "مائه";
} else { // 10x x: is not 0
return "مائه" + " و " + convertOneDigits(String.valueOf(threeDigits.charAt(2)));
}
} else {// 1xx x: is not 0
return "مائه" + " و " + convertTwoDigits(threeDigits.substring(1, 3));
}
}
case 2: { // 200 - 299
if (getIntVal(threeDigits.charAt(1)) == 0) { // 20x
if (getIntVal(threeDigits.charAt(2)) == 0) { // 200
return "مائتين";
} else { // 20x x:not 0
return "مائتين" + " و " + convertOneDigits(String.valueOf(threeDigits.charAt(2)));
}
} else { // 2xx x:not 0
return "مائتين" + " و " + convertTwoDigits(threeDigits.substring(1, 3));
}
}
case 3:
case 4:
case 5:
case 6:
case 7:
case 8:
case 9: { // 300 - 999
if (getIntVal(threeDigits.charAt(1)) == 0) { // x0x x:not 0
if (getIntVal(threeDigits.charAt(2)) == 0) { // x00 x:not 0
return convertOneDigits(String.valueOf(threeDigits.charAt(1) + "مائه"));
} else { // x0x x:not 0
return convertOneDigits(String.valueOf(threeDigits.charAt(0))) + "مائه" + " و "
+ convertOneDigits(String.valueOf(threeDigits.charAt(2)));
}
} else { // xxx x:not 0
return convertOneDigits(String.valueOf(threeDigits.charAt(0))) + "مائه" + " و "
+ convertTwoDigits(threeDigits.substring(1, 3));
}
}
case 0: { // 000 - 099
if (threeDigits.charAt(1) == '0') { // 00x
if (threeDigits.charAt(2) == '0') { // 000
return "";
} else { // 00x x:not 0
return convertOneDigits(String.valueOf(threeDigits.charAt(2)));
}
} else { // 0xx x:not 0
return convertTwoDigits(threeDigits.substring(1, 3));
}
}
default:
return "";
}
}
private static String convertFourDigits(String fourDigits) {
// xxxx
switch (getIntVal(fourDigits.charAt(0))) {
case 1: { // 1000 - 1999
if (getIntVal(fourDigits.charAt(1)) == 0) { // 10xx x:not 0
if (getIntVal(fourDigits.charAt(2)) == 0) { // 100x x:not 0
if (getIntVal(fourDigits.charAt(3)) == 0) { // 1000
return "ألف";
} else { // 100x x:not 0
return "ألف" + " و " + convertOneDigits(String.valueOf(fourDigits.charAt(3)));
}
} else { // 10xx x:not 0
return "ألف" + " و " + convertTwoDigits(fourDigits.substring(2, 3));
}
} else { // 1xxx x:not 0
return "ألف" + " و " + convertThreeDigits(fourDigits.substring(1, 4));
}
}
case 2: { // 2000 - 2999
if (getIntVal(fourDigits.charAt(1)) == 0) { // 20xx
if (getIntVal(fourDigits.charAt(2)) == 0) { // 200x
if (getIntVal(fourDigits.charAt(3)) == 0) { // 2000
return "ألفين";
} else { // 200x x:not 0
return "ألفين" + " و " + convertOneDigits(String.valueOf(fourDigits.charAt(3)));
}
} else { // 20xx x:not 0
return "ألفين" + " و " + convertTwoDigits(fourDigits.substring(2, 3));
}
} else { // 2xxx x:not 0
return "ألفين" + " و " + convertThreeDigits(fourDigits.substring(1, 4));
}
}
case 3:
case 4:
case 5:
case 6:
case 7:
case 8:
case 9: { // 3000 - 9999
if (getIntVal(fourDigits.charAt(1)) == 0) { // x0xx x:not 0
if (getIntVal(fourDigits.charAt(2)) == 0) { // x00x x:not 0
if (getIntVal(fourDigits.charAt(3)) == 0) { // x000 x:not 0
return convertOneDigits(String.valueOf(fourDigits.charAt(0))) + " ألاف";
} else { // x00x x:not 0
return convertOneDigits(String.valueOf(fourDigits.charAt(0))) + " ألاف" + " و "
+ convertOneDigits(String.valueOf(fourDigits.charAt(3)));
}
} else { // x0xx x:not 0
return convertOneDigits(String.valueOf(fourDigits.charAt(0))) + " ألاف" + " و "
+ convertTwoDigits(fourDigits.substring(2, 3));
}
} else { // xxxx x:not 0
return convertOneDigits(String.valueOf(fourDigits.charAt(0))) + " ألاف" + " و "
+ convertThreeDigits(fourDigits.substring(1, 4));
}
}
default:
return "";
}
}
private static String convertFiveDigits(String fiveDigits) {
if (convertThreeDigits(fiveDigits.substring(2, 5)).length() == 0) { // xx000
// x:not
// 0
return convertTwoDigits(fiveDigits.substring(0, 2)) + " ألف ";
} else { // xxxxx x:not 0
return convertTwoDigits(fiveDigits.substring(0, 2)) + " ألفا " + " و "
+ convertThreeDigits(fiveDigits.substring(2, 5));
}
}
private static String convertSixDigits(String sixDigits) {
if (convertThreeDigits(sixDigits.substring(2, 5)).length() == 0) { // xxx000
// x:not
// 0
return convertThreeDigits(sixDigits.substring(0, 3)) + " ألف ";
} else { // xxxxxx x:not 0
return convertThreeDigits(sixDigits.substring(0, 3)) + " ألفا " + " و "
+ convertThreeDigits(sixDigits.substring(3, 6));
}
}
private static int getIntVal(char c) {
return Integer.parseInt(String.valueOf(c));
}
// ----------------------------------------------------------
public static void main(String[] args) {
System.out.println(TafqeetMain.convertNumberToEnglishWords("123456"));
System.out.println(TafqeetMain.convertNumberToArabicWords("123412.11"));
}
}