> ## Documentation Index
> Fetch the complete documentation index at: https://docs.superoffice.com/llms.txt
> Use this file to discover all available pages before exploring further.

# The AddressFormatter class

> Localization, class AddressFormatter

The `AddressFormatter` class to help you work with the complexities of address formats. It provides the following functions to format addresses:

* FormatContact
* FormatPerson
* FormatQuote

Reading the `FormattedAddress` data structure is very straightforward. Simply loop over the `FormattedAddress` lines and print out each `IFormattedField` from `FormattedFields`.

The following code example demonstrates using `AddressFormatter` to get a formatted representation of a contact's address, then loops over each line and prints out each address field.

```csharp theme={null}
using SuperOffice;
using SuperOffice.CRM.Entities;
using SuperOffice.CRM.Globalization;
using SuperOffice.CRM.Security;

using(SoSession session = SoSession.Authenticate("SAL0", ""))
{
  // get company ID 4
  Contact company = Contact.GetFromIdxContactId(4);

  // format the address of the contact to the format of the
  // country that the contact belongs to

  var formattedAddress = AddressFormatter.FormatContact(company);

  foreach (FormattedFields fs in formattedAddress)
  {
    foreach (IFormattedField f in fs)
    {
      Console.WriteLine(f.Name + " " + f.Value);
    }

    Console.WriteLine();
  }
}

// outputs
//---------
//StreetAddress1: A-gata 23
//StreetZipcode: 0123
//StreetCity: OSLO
```

Now, look at a `ContactRow`. Because it only contains properties from the `contact` table, it does not contain an `Address` property. To get a `FormattedAddress` from a `ContactRow`, the `AddressFormatter` expects an `AddressRow` as well.

```csharp theme={null}
using SuperOffice.CRM.Globalization;
using SuperOffice.CRM.Security;
using SuperOffice.CRM.Rows;
using SuperOffice;
using(SoSession session = SoSession.Authenticate("SAL0", ""))
{
  // retrieve the contact row no 4

  ContactRow conRow = ContactRow.GetFromIdxContactId(4);
  // get the postal address of the contact row no 4

  AddressRow postalAddress = AddressRow.GetFromIdxOwnerIdAtypeIdx(4, SuperOffice.Data.AddressType.ContactPostalAddress);
  // get the street address of the contact row no 4

  AddressRow streetAddress = AddressRow.GetFromIdxOwnerIdAtypeIdx(4, SuperOffice.Data.AddressType.ContactStreetAddress);
  // format the address according to the country that the contact belongs to

  FormattedAddress formattedAddress = AddressFormatter.FormatContact(conRow, postalAddress, streetAddress);
}
```

You can see we have done the same thing using only rows. The `FormatContact` method converts the postal and street address to the format of the country that the contact belongs to. The example uses the `AddressRow.GetFromIdxOwnerIdAtypeIdx` method to get the desired contact address type.

**Pre-defined address field names for person and contact:**

| Person address types | Contact address types | Quote address types |
| -------------------- | --------------------- | ------------------- |
| Address1             | PostalAddress1        | BillingAddress1     |
| Address2             | PostalAddress2        | BillingAddress2     |
| Address3             | PostalAddress3        | BillingAddress3     |
| City                 | PostalCity            | BillingCity         |
| County               | PostalCounty          | BillingCounty       |
| State                | PostalState           | BillingState        |
| Zipcode              | PostalZipcode         | BillingZipcode      |
|                      | StreetAddress1        | ShippingAddress1    |
|                      | StreetAddress2        | ShippingAddress2    |
|                      | StreetAddress3        | ShippingAddress3    |
|                      | StreetCity            | ShippingCity        |
|                      | StreetCounty          | ShippingCounty      |
|                      | StreetState           | ShippingState       |
|                      | StreetZipcode         | ShippingZipcode     |

Writing address information back to this data structure is not useful. There is no way to persist changes to a **FormattedAddress** back to the database. Therefore, when writing code inside NetServer core use the Contact and Person entity types to persist address changes. Both entity types expose an `Address` property with relevant properties for dealing with respective address formats.

```csharp theme={null}
// Example Person Address
Person person = Person.GetFromIdxPersonId(3);
person.Address.Address1 = "A-gata 23";
person.Address.City     = "OSLO";
person.Address.Zipcode  = "0123";
person.Save();
// Example Contact Address
Contact contact = Contact.GetFromIdxContactId(3);
contact.PostalAddress.Address1 = "";
contact.PostalAddress.Address2 = "";
contact.PostalAddress.Address3 = "";
contact.PostalAddress.City     = "";
contact.PostalAddress.County   = "";
contact.PostalAddress.Zipcode  = "";
//----------------------------------
contact.StreetAddress.Address1 = "";
contact.StreetAddress.Address2 = "";
contact.StreetAddress.Address3 = "";
contact.StreetAddress.City     = "";
contact.StreetAddress.County   = "";
contact.StreetAddress.Zipcode  = "";
contact.Save();
```

Working with address information in SuperOffice CRM had never been easier. Hopefully, now you understand the FormattedAddress structure, its' madness, and know better how to deal with it in future projects.


## Related topics

- [SuperOffice.CRM.Globalization namespace](/en/api/localization/superoffice-crm-globalization.md)
- [SuperOffice Globalization](/en/api/localization/index.md)
- [Person name formatter](/en/api/localization/personnameformatter.md)
- [Phone formatter](/en/api/localization/phoneformatter.md)
- [CultureDataFormatter](/en/api/localization/culture/culturedataformatter.md)
- [SuperOffice.WebApi.Data.CultureDataFormatter](/en/api/reference/webapi/SuperOffice.WebApi.Data.CultureDataFormatter.md)
