1

I am trying to create a string of address in this format: Street, City, State, Country, Zip. Assume that there is an Address object called addr which has account's shipping address.

Address addr = Account__r.ShippingAddress; // Ignore the syntax here and assume that addr has Address.

My Challenge here is I want to build a string of the addr with comma separated. Example if shipping address has

Shipping Street : 123th Street
Shipping City   : SFO
Shipping State/Province : CA
Shipping Zip/Postal Code: 12345
Shipping Country: USA

I want to form a string like String s = 123th Street, SFO, CA, 12345, USA

The catch :

There could be different possiblity that street may not be present or country may not be present in that case the String should logically display the commas example - city, state, zip -> SFO, CA, 12345. Also I do not want to display NULL in case street/country/state/zip is not available. So it is possible that any of the data might be missing and my string should accommodate for missing data and produce the correct comma separated string.

This is what I got started with but I see the logic is getting complex:

String street; String city; String state; String country; String zip;
         Address addr = Account__r.ShippingAddress; 
          street = addr.getStreet() <> NULL ? addr.getStreet() : ''; // to make sure I do not display NULL in string
          if(street == NULL){
          city = addr.getCity() <> NULL ? addr.getCity() : '';
          }else{
          city = addr.getCity() <> NULL ? ', ' + addr.getCity() : '';
          }
          if(city == NULL){
          state = addr.getState() <> NULL ? addr.getState() : '';
          }else{
          state = addr.getState() <> NULL ? ', ' + addr.getState() : '';
          }
          if(state == NULL){
          country = addr.getCountry() <> NULL ? addr.getCountry() : '';
          }else{
          country = addr.getCountry() <> NULL ? ', ' + addr.getCountry() : '';
          }
          if(country == NULL){
          zip = addr.getPostalCode() <> NULL ? addr.getPostalCode() : '';
          }else{
          zip = addr.getPostalCode() <> NULL ? ', ' + addr.getPostalCode() : '';
          }
     String addString = street + '' + city + '' + state + '' + country + '' + zip;
3

For things like this, I use an array:

String[] addr = new String[] {
  record.Street, record.City, record.State, record.PostalCode, record.Country
};

for(Integer i = 4; i >= 0; i--) {
  if(addr[i] == null) {
    addr.remove(i);
  }
}

String theAddr = String.join(addr, ',');
| improve this answer | |
  • SF needs a List method to remove nulls. – Eric May 18 '17 at 0:06
  • @Eric yeah, or a list indexof method would help. – sfdcfox May 18 '17 at 0:14
  • Maybe make it for(Integer i = addr.size()-1; i>=0;i--) to make it easier to add or remove items from the List or more reusable and passing in a list to a utility method – Eric May 18 '17 at 1:06
2

Note: This is the current behavior, but not a guaranteed result

Not sure if this is an anomaly or not as the sets are unordered but doing this seems to put it back in the order they were added. Also removes a loop.

//Build the set of values
Set<String> tmp = New Set<String>{'C','B',null,'A',null,'Z','D'};
System.debug(tmp);

19:19:42.23 (23673744)|USER_DEBUG|[2]|DEBUG|{null, A, B, C, D, Z}

Notice how they are not in the order they were put in

//remove the null values
tmp.remove(null);

Now we join the remaining values back

System.debug(string.join(New List<String>(tmp),','));

19:19:42.23 (23854080)|USER_DEBUG|[4]|DEBUG|C,B,A,Z,D

Whala - They are back in the order they were initially added and the nulls are removed

So in your case

Set<String> tmp = New Set<String>{
   record.Street, record.City, record.State, record.PostalCode, record.Country
};
tmp.remove(null);
String theAddr = string.join(New List<String>(tmp),',');
| improve this answer | |
  • This is the current behavior, but not a guaranteed result. We unfortunately cannot rely on this behavior. – sfdcfox May 17 '17 at 23:53
  • @sfdcfox - Thanks. Wonder if it is do to a pointer to the original list or what.... – Eric May 17 '17 at 23:55
  • @Eric Interesting to see that how behavior changes with NULL. – SfdcBat May 18 '17 at 0:02
  • @SfdcBat - Not sure I understand. I already have null in there. Without null it works the same – Eric May 18 '17 at 0:03
  • @Eric Your solution is correct. I was referring to the initially part where you experimented the order with NULL – SfdcBat May 18 '17 at 0:05
1

It will be like this:

List<String> lstStr = new List<String>();
Address addr = Account__r.ShippingAddress; 
if(addr.getStreet() !=null) lstStr.add(addr.getStreet());
if(addr.getCity() !=null) lstStr.add(addr.getCity());
if(addr.getState() !=null) lstStr.add(addr.getState());
if(addr.getCountry() !=null) lstStr.add(addr.getCountry());
if(addr.getPostalCode() !=null) lstStr.add(addr.getPostalCode());

String finalAddress = String.join(lstStr,',');
| improve this answer | |
  • @SfdcBat please don't pick up bad programming habits. The body of an if statement should always be a proper block with { and }. This is perfectly fine logic, but writing compact code like this isn't recommended. It's too easy to make mistakes. – sfdcfox May 18 '17 at 0:29
  • @sfdcfox thank you for the comment. I did feel that I could make a mistake with the curly braces missing. I have actually used what Eric had given as solution as it had just 4 lines of code – SfdcBat May 18 '17 at 0:32
  • @SfdcBat - sfdcfox's method is the one guaranteed to work. This answer while it works requires multiple line updates to add or remove values. In addition to the above comments. Also, a reusable utility method would be more useful than code for a specific scenario – Eric May 18 '17 at 1:03

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.