Technology Blogs by SAP
Learn how to extend and personalize SAP applications. Follow the SAP technology blog for insights into SAP BTP, ABAP, SAP Analytics Cloud, SAP HANA, and more.
cancel
Showing results for 
Search instead for 
Did you mean: 
1,754
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:


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
2 Comments