6

I have an apex class which iterates through a word and capitalises every first letter, however we can't use this on the name field in accounts because accounts with acronyms or initials get inappropriately cased.

I tried to add an if statement that determines if the whole word is already upper case, but it didn't work because through debug statements I found out that Apex was equating "test" and "TEST" as the same.

Does anyone have a workaround for this or is there a way of doing this that I'm missing?

public static String capitaliseFirstLetters(String name) 
{
    name = name.toLowerCase();
    String result = '';
    //List of separators after which we should capitalize letter
    String[] separatorList = new String[]{' ','-'};
    if (name != null && name != '') 
    {
        result = name;
        for(String separator : separatorList)
        {
            String tmpResult = '';
            for (String iter : result.split('[' + separator+']+')) 
            {        
                System.debug('Begin iter loop. tmpResult: ' + tmpResult + '. iter: ' + iter);         
                if (iter != null && iter != '') 
                {
                    System.debug('Iter: ' + iter + ' is not equal to null AND not blank.');
                    if (iter != iter.toUpperCase())
                    {
                        System.debug('Iter: ' + iter + ' is not equal to an upper case version of itself: ' + iter.toUpperCase() + '.');
                        if (iter.length() > 1 ) 
                        {   
                            System.debug('Iter is bigger than 1.');
                            tmpResult += iter.substring(0,1).toUpperCase() + iter.substring(1,iter.length()) + separator;
                        }
                        else 
                        {
                            System.debug('Iter is not bigger than 1.');
                            tmpResult += iter.substring(0,1).toUpperCase() + separator;
                        }
                    }
                    else
                    {
                        System.debug('Iter: ' + iter + ' is equal to an upper case version of itself: ' + iter.toUpperCase() + '.');
                        tmpResult += iter + separator;
                    }
                }
                else
                {
                    System.debug('Iter is either equal to null or blank.');
                }
                System.debug('End iter loop. tmpResult: ' + tmpResult + '. iter: ' + iter);   
            }
            result = tmpResult.substring(0, tmpResult.length() - 1);
        }
    }
    return result;
}
8

Can you use the String .equals method, as this is case sensitive

http://www.salesforce.com/us/developer/docs/dbcom_apex250/Content/apex_methods_system_string.htm

String myString1 = 'Abc';
String myString2 = 'abc';
Boolean result = myString1.equals(myString2);
System.assertEquals(result, false);

Note that the == operator also performs String comparison, but is case-insensitive to match Apex semantics. (== is case-sensitive for ID comparison for the same reason.)

  • I found the reference for these string operations almost immediately after I posted the question but thank you. Also noticed that the function sets the whole word to lower case at the start anyway :/ – Adam Mar 25 '14 at 16:17
2

Try using String methods.

if (!iter.equals(iter.toUpperCase()))

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service, privacy policy and cookie policy

Not the answer you're looking for? Browse other questions tagged or ask your own question.