Skip to Content
Technical Articles
Author's profile photo Marcos Pombo

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

Assigned Tags

      2 Comments
      You must be Logged on to comment or reply to a post.
      Author's profile photo Syambabu Allu
      Syambabu Allu

      Hello Marcos,

      it's really nice tip to convert the number to words.

      Thanks for sharing!!

      Thank you,

      Syam

      Author's profile photo Sebastian Alvarez
      Sebastian Alvarez

      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!