package com.felix.util; /** * Filter an input String by replacing any integers by a german number-string, * e.g. "apple 1007 i-book" --> "apple eintausendundsieben i-book" * * @see * @author fburkhardt, tziroff * @author $Author: fburkhardt $ * @version $Revision: v1.0 $ * @since 07.10.2003 */ public class NumberToWord { private int i; private int offset; private String ret = ""; private int enumerationCounter = 1; private String locale = "de-DE"; /** * Constructor for the NumberToWord object */ public NumberToWord() { i = 0; offset = 0; enumerationCounter = 1; ret = ""; } /** * */ public void setResetEnumerationCounter() { enumerationCounter = 1; } /** * * * @return */ public String getNextEnumeration() { String retValue = this.getEnumeration(enumerationCounter); enumerationCounter++; return retValue; } /** * Filter an input String by replacing any integers by a german * number-string, e.g. "apple 1007 i-book" --> "apple eintausendundsieben * i-book" * * @param in * Description of the Parameter * @return The converted String. */ public String filtNum(String in) { offset = 0; ret = ""; // remove leading 0 if ((in.length() == 2) && in.startsWith("0")) { in = in.substring(1, 2); } for (i = 0; i < in.length(); i++) { if (!Character.isDigit(in.charAt(i))) { ret += in.charAt(i); } else { offset = checkDigits(in.substring(i, in.length())); i = i + offset; } } if (in.length() >= 1) { char lastOne = in.charAt(in.length() - 1); if (Character.isDigit(lastOne)) { if (in.length() >= 2) { char beforelastOne = in.charAt(in.length() - 2); if (!Character.isDigit(beforelastOne)) { ret += (" " + digitToWord(lastOne)); } } else { ret += (" " + digitToWord(lastOne)); } } } return ret; } /** * Description of the Method * * @param dg * Description of the Parameter * @return Description of the Return Value */ private int checkDigits(String dg) { String nums = ""; String word = ""; int i; int j; int k; for (i = 0; i < dg.length(); i++) { if ((nums.length() == 0) && (dg.charAt(i) == '0')) { continue; } if (!Character.isDigit(dg.charAt(i))) { break; } nums += dg.substring(i, i + 1); } if (nums.length() == 0) { nums = "0"; } k = nums.length(); if (k > 12) { for (j = 0; j < k; j++) { ret += digitToWord(dg.charAt(j)); } return i - 1; } if (locale.equalsIgnoreCase("en-US")) { if (nums.length() > 1) { for (j = 0; j < nums.length(); j++) { word = digitToWord(nums.charAt(j)); if ((k > 1) && (nums.charAt(j) == '1')) { word = "one"; } switch (k) { case 12: if (nums.charAt(j) != '0') { ret += (word + "hundred "); } break; case 11: { ret += (tenToNintynine(nums.charAt(j), nums .charAt(j + 1)) + " billion "); j++; k--; } break; case 10: { if (nums.length() == 10) { if (word.compareTo("one") == 0) { ret += " one billion "; } else { ret += (" " + word + " billions "); } } break; } case 9: if (nums.charAt(j) != '0') { ret += (" " + word + " hundred "); } break; case 8: { ret += (" " + tenToNintynine(nums.charAt(j), nums .charAt(j + 1)) + " million "); j++; k--; } break; case 7: { if (nums.length() == 7) { if (word.compareTo("one") == 0) { ret += " one million "; } else { ret += (" " + word + " millions "); } } } break; case 6: if (nums.charAt(j) != '0') { ret += (" " + word + "hundred "); } break; case 5: { ret += (" " + tenToNintynine(nums.charAt(j), nums .charAt(j + 1)) + " thousand "); j++; k--; } break; case 4: { if (nums.length() == 4) { ret += (" " + word + " thousand "); } } break; case 3: if (nums.charAt(j) != '0') { ret += (" " + word + " hundred "); } break; case 2: { ret += (" " + tenToNintynine(nums.charAt(j), nums .charAt(j + 1)) + " "); j = j + 2; } break; } k--; } } } else { if (nums.length() > 1) { for (j = 0; j < nums.length(); j++) { word = digitToWord(nums.charAt(j)); if ((k > 1) && (nums.charAt(j) == '1')) { word = "ein"; } switch (k) { case 12: if (nums.charAt(j) != '0') { ret += (word + "hundert "); } break; case 11: { ret += (tenToNintynine(nums.charAt(j), nums .charAt(j + 1)) + " Milliarden "); j++; k--; } break; case 10: { if (nums.length() == 10) { if (word.compareTo("ein") == 0) { ret += " eine Miliarde "; } else { ret += (" " + word + " Millionen "); } } break; } case 9: if (nums.charAt(j) != '0') { ret += (" " + word + " hundert "); } break; case 8: { ret += (" " + tenToNintynine(nums.charAt(j), nums .charAt(j + 1)) + " Millionen "); j++; k--; } break; case 7: { if (nums.length() == 7) { if (word.compareTo("ein") == 0) { ret += " eine Million "; } else { ret += (" " + word + " Millionen "); } } } break; case 6: if (nums.charAt(j) != '0') { ret += (" " + word + "hundert "); } break; case 5: { ret += (" " + tenToNintynine(nums.charAt(j), nums .charAt(j + 1)) + " tausend "); j++; k--; } break; case 4: { if (nums.length() == 4) { ret += (" " + word + " tausend "); } } break; case 3: if (nums.charAt(j) != '0') { ret += (" " + word + " hundert "); } break; case 2: { ret += (" " + tenToNintynine(nums.charAt(j), nums .charAt(j + 1)) + " "); j = j + 2; } break; } k--; } } } addSpecialChar(dg, nums, i); return i - 1; } /** * Adds a feature to the SpecialChar attribute of the NumberToWord object * * @param dg * The feature to be added to the SpecialChar attribute * @param nums * The feature to be added to the SpecialChar attribute * @param i * The feature to be added to the SpecialChar attribute */ private void addSpecialChar(String dg, String nums, int i) { // is a special char possible if ((dg.length() > 1) && (dg.length() > i)) { // is the current char a . if ((dg.charAt(i) == '.')) { // then append a word if its the last one ( 123. ), a part of a // sentence ( Karl der 1. lebte von ) or it follows a new line if ((dg.length() == (i + 1)) || ((dg.length() > (i + 1)) && ((dg.charAt(i + 1) == ' ') || (dg .charAt(i + 1) == '\n')))) { // ( ( dg.charAt( i+1 ) == ' ' ) || || ( dg.charAt( i+1 ) == // '\n' ) ) if (locale.equalsIgnoreCase("en-US")) { if (nums.compareTo("1") == 0) { ret += " first "; } else if (nums.length() == 1) { ret += (digitToWord(nums.charAt(0)) + "ly "); } else { ret += "ly "; } } else { if (nums.compareTo("1") == 0) { ret += " erstens "; } else if (nums.compareTo("3") == 0) { ret += " drittens "; } else if (nums.compareTo("7") == 0) { ret += " siebtens "; } else if (nums.length() == 1) { ret += (digitToWord(nums.charAt(0)) + "tens "); } else { ret += "tens "; } } } } else { if (nums.length() == 1) { ret += (" " + digitToWord(nums.charAt(0)) + " "); } } if (locale.equalsIgnoreCase("en-US")) { if (dg.length() > (i + 1)) { if ((dg.charAt(i) == '.') && (Character.isDigit(dg.charAt(i + 1)))) { ret += " dot "; } if ((dg.charAt(i) == ',') && (Character.isDigit(dg.charAt(i + 1)))) { ret += " comma "; } } } else { if (dg.length() > (i + 1)) { if ((dg.charAt(i) == '.') && (Character.isDigit(dg.charAt(i + 1)))) { ret += " Punkt "; } if ((dg.charAt(i) == ',') && (Character.isDigit(dg.charAt(i + 1)))) { ret += " Komma "; } } } } } /** * Description of the Method * * @param c * Description of the Parameter * @return Description of the Return Value */ private String digitToWord(int c) { if (locale.equalsIgnoreCase("en-US")) { switch (c) { case '0': return "zero"; case '1': return "one"; case '2': return "two"; case '3': return "three"; case '4': return "four"; case '5': return "five"; case '6': return "six"; case '7': return "seven"; case '8': return "eight"; case '9': return "nine"; } } else { switch (c) { case '0': return "null"; case '1': return "eins"; case '2': return "zwei"; case '3': return "drei"; case '4': return "vier"; case '5': return "fünf"; case '6': return "sechs"; case '7': return "sieben"; case '8': return "acht"; case '9': return "neun"; } } return "error: c>9"; } /** * Description of the Method * * @param c1 * Description of the Parameter * @param c2 * Description of the Parameter * @return Description of the Return Value */ private String tenToNintynine(int c1, int c2) { String german_number = ""; if (locale.equalsIgnoreCase("en-US")) { if ((c1 == '1') && (c2 == '1')) { german_number = "eleven"; return (german_number); } if ((c1 == '1') && (c2 == '2')) { german_number = "twelve"; return (german_number); } if ((c1 == '1') && (c2 == '3')) { german_number = "thirteen"; return (german_number); } if ((c1 == '1') && (c2 == '4')) { german_number = "fourteen"; return (german_number); } if ((c1 == '1') && (c2 == '5')) { german_number = "fifteen"; return (german_number); } if ((c1 == '1') && (c2 == '6')) { german_number = "sixteen"; return (german_number); } if ((c1 == '1') && (c2 == '7')) { german_number = "seventeen"; return (german_number); } if ((c1 == '1') && (c2 == '8')) { german_number = "eighteen"; return (german_number); } if ((c1 == '1') && (c2 == '9')) { german_number = "nineteen"; return (german_number); } switch (c1) { case '1': german_number += "ten"; break; case '2': german_number += "twenty"; break; case '3': german_number += "thirty"; break; case '4': german_number += "fourty"; break; case '5': german_number += "fifty"; break; case '6': german_number += "sixty"; break; case '7': german_number += "seventy"; break; case '8': german_number += "eighty"; break; case '9': german_number += "ninety"; break; } if (c2 != '0') { german_number += digitToWord(c2); } } else { if ((c1 == '1') && (c2 == '1')) { german_number = "elf"; return (german_number); } if ((c1 == '1') && (c2 == '2')) { german_number = "zw�lf"; return (german_number); } if ((c1 == '1') && (c2 == '7')) { german_number = "siebzehn"; return (german_number); } // sprintf(german_number,"\0"); if (c2 != '0') { if ((c2 == '1') && (c1 != '0')) { german_number = "ein"; } else { german_number = digitToWord(c2); } } if ((c1 > '1') && (c2 != '0')) { german_number += "und"; } switch (c1) { case '1': german_number += "zehn"; break; case '2': german_number += "zwanzig"; break; case '3': german_number += "drei�ig"; break; case '4': german_number += "vierzig"; break; case '5': german_number += "fünfzig"; break; case '6': german_number += "sechzig"; break; case '7': german_number += "siebzig"; break; case '8': german_number += "achtzig"; break; case '9': german_number += "neunzig"; break; } } return (german_number); } /** * returns the number as enumeration word e.g. 12 = zw�lfte * * @param number * the input value * @return the german enumeration word */ public String getEnumeration(int number) { if (this.locale.equalsIgnoreCase("en-US")) { if (number == 1) { return " first"; } else if (number == 3) { return " second"; } else if (number == 3) { return " third"; } else if (number < 10) { return digitToWord(String.valueOf(number).charAt(0)).trim() + "th"; } else { return filtNum(String.valueOf(number)).trim() + "th"; } } if (number == 1) { return " erste"; } else if (number == 3) { return " dritte"; } else if (number == 7) { return " siebte"; } else if (number == 16) { return " sechzehnte"; } else if (number < 10) { return digitToWord(String.valueOf(number).charAt(0)).trim() + "te"; } else { return filtNum(String.valueOf(number)).trim() + "te"; } } /** * @return Returns the locale. */ public String getLocale() { return locale; } /** * @param locale * The locale to set. */ public void setLocale(String locale) { this.locale = locale; } /** * * * @param args */ public static void main(String[] args) { try { NumberToWord nf = new NumberToWord(); System.out.println(nf.filtNum("a1")); /* * System.out.println("ouput: " + nf.filtNum("11")); * System.out.println("ouput: " + nf.filtNum("21")); * System.out.println("ouput: " + nf.filtNum("31")); * System.out.println("ouput: " + nf.filtNum("031")); * System.out.println("ouput: " + nf.filtNum("00")); * System.out.println("ouput: " + nf.filtNum("06")); * System.out.println("ouput: " + nf.filtNum("6")); * System.out.println("ouput: " + nf.filtNum("0")); * System.out.println("ouput: " + nf.filtNum(" Sabrina - Total * verhext! ")); System.out.println("ouput: " + nf.filtNum(" * Sabri1na - Total verhext! ")); System.out.println("ouput: " + * nf.filtNum("1 Sabrina - Total verhext! ")); * System.out.println("ouput: " + nf.filtNum("p1")); * System.out.println("ouput: " + nf.filtNum("Sabrina - Total * verhext!")); */ } catch (Exception e) { e.printStackTrace(); } } }