Technical Articles
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:
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
Hello Marcos,
it's really nice tip to convert the number to words.
Thanks for sharing!!
Thank you,
Syam
Hey Marcos it's a great contribution!
I'm using it right now!
Just one thing, in the code check that you have many calls to "numberToWord" but it does not exists, it has to be changed to "numberToWord_sp".
It works perfect!
Gracias!