Groovy: convert number to words (useful for CPI)

Hi Community!

Some time ago, I got one issue in a customer, the situation was following:

The customer needed to send a number + number converted to words from SSFF via CPI to a third-party system.

Architecture Landscape:

Landscape

What’s the problem here? SSFF sends only the number, not the number in words. So only way to do it where in CPI or in the third-party system. but last option was also not possible.

I couldn’t found any function to convert numbers into words in CPI or Groovy (please, feel free to share is there another way/solution). So I write a code in groovy to do it and convert numbers to words (based on differents JAVA codes that I found), and you can also convert it in two differents languages, Spanish and English.

Follow the groovy code (Input number it’s in p_salary that is a propery defined in the iFlow, output will be in the properties p_salary_txt_sp for Spanish and  p_salary_txt_en for English):

import com.sap.gateway.ip.core.customdev.util.Message;
import java.util.HashMap;
def Message processData(Message message) { int number = 0; //Get property from iflow p_salary map = message.getProperties(); p_salary = map.get("p_salary"); number = Integer.parseInt(p_salary); //Set response number in words in new property p_salary_txt_sp for Spanish String resp = numberToWord_sp(number); message.setProperty("p_salary_txt_sp", resp); //Set response number in words in new property p_salary_txt_sp for English String resp = numberToWord_en(number); message.setProperty("p_salary_txt_en", resp); return message; } //Spanish translate
private static String numberToWord_sp(int number) { // variable to hold string representation of number String words = ""; def unitsArray = ["cero", "un", "dos", "tres", "cuatro", "cinco", "seis", "siete", "ocho", "nueve", "diez", "once", "doce", "trece", "catorce", "quince", "dieciseis", "diecisiete", "dieciocho", "diecinueve"] as String[]; def tensArray = ["cero", "diez", "veinti", "treinta", "cuarenta", "cincuenta", "sesenta", "setenta", "ochenta", "noventa" ]; if (number == 0) { return "cero"; } // add minus before conversion if the number is less than 0 if (number < 0) { // convert the number to a string String numberStr = "" + number; // remove minus before the number numberStr = numberStr.substring(1); // add minus before the number and convert the rest of number return "menos " + numberToWord(Integer.parseInt(numberStr)); } // check if number is divisible by 1 million if (number >= 1000000) { if (number >= 1000000 && number < 2000000) { int numAux = number / 1000000; words += numberToWord(numAux) + " millon "; number %= 1000000; }else{ int numAux = number / 1000000; words += numberToWord(numAux) + " millones "; number %= 1000000; } } // check if number is divisible by 1 thousand if (number >= 1000) { if(number == 1000) { words += "mil "; number %= 1000; }else{ int numAux = number / 1000; if (numAux == 1){ words += "mil "; number %= 1000; }else{ words += numberToWord(numAux) + " mil "; number %= 1000; } } } // check if number is divisible by 1 hundred if (number >= 100) { if(number == 100) { words += "cien "; number %= 100; }else{ // Set words for exceptional spells in spanish like 500 int numAux = number / 100; if (numAux == 1){ words += "ciento "; number %= 100; }else if (numAux == 5){ words += "quinientos "; number %= 100; }else if (numAux == 9){ words += "novecientos "; number %= 100; }else{ words += numberToWord(numAux) + "cientos "; number %= 100; } } } if (number > 0) { // check if number is within teens if (number < 20) { // fetch the appropriate value from unit array words += unitsArray[number]; } else if (number == 20){ words += "veinte"; } else if (number < 30 && number > 20 ){ int numAux = number / 10; words += tensArray[numAux]; if ((number % 10) > 0) { words += unitsArray[number % 10]; } }else{ // fetch the appropriate value from tens array int numAux = number / 10; words += tensArray[numAux]; if ((number % 10) > 0) { words += " y " + unitsArray[number % 10]; } } } return words;
} // English translate
private static String numberToWord_en(int number) { // variable to hold string representation of number String words = ""; def unitsArray = ["zero", "one", "two", "three", "four", "five", "six", "seven", "eight", "nine", "ten", "eleven", "twelve", "thirteen", "fourteen", "fifteen", "sixteen", "seventeen", "eighteen", "nineteen"] as String[]; def tensArray = ["zero", "ten", "twenty", "thirty", "forty", "fifty", "sixty", "seventy", "eighty", "ninety" ]; if (number == 0) { return "zero"; } // add minus before conversion if the number is less than 0 if (number < 0) { // convert the number to a string String numberStr = "" + number; // remove minus before the number numberStr = numberStr.substring(1); // add minus before the number and convert the rest of number return "minus " + numberToWord(Integer.parseInt(numberStr)); } // check if number is divisible by 1 million if (number >= 1000000) { int numAux = number / 1000000; words += numberToWord(numAux) + " million "; number %= 1000000; } // check if number is divisible by 1 thousand if (number >= 1000) { int numAux = number / 1000; words += numberToWord(numAux) + " thousand "; number %= 1000; } // check if number is divisible by 1 hundred if (number >= 100) { int numAux = number / 100; words += numberToWord(numAux) + " hundred "; number %= 100; } if (number > 0) { // check if number is within teens if (number < 20) { // fetch the appropriate value from unit array words += unitsArray[number]; } else { // fetch the appropriate value from tens array int numAux = number / 10; words += tensArray[numAux]; //System.out.print(number); if ((number % 10) > 0) { words += "-" + unitsArray[number % 10]; } } } return words;
}

Any doubt or improvement, please feel free to comment.

Also if you are interested in more Cloud Integration topics, follow the following link: Cloud Integration | SAP | SAP Blogs