We've received the title question several times in the past few months.  While a specific answer is already on Ask a Cartographer, I thought it would be good to address some of the circumstances that cause problems or require exceptions to our response:

  1. I've got the county parcel database and I'm only supposed to label the parcels in my city.
  2. The address field is empty for some of my features, and that wrecks the formatting.
  3. My boss wants different formatting for parcels that are larger than one acre.
  4. In my label, I need my acreage rounded to just two decimal places.

Here's a sample label expression someone sent in that conforms with our response on Ask a Cartographer:

[NWLOCN] & vbCrLf & [BLKLOT] & vbCrLf & Round ([SHAPE.area] /43560,2) & "ac"

Where [NWLOCN] is the street address number, [BLKLOT] is the block number, and "Round ([SHAPE.area] /43560,2)" handles the acreage.

Here are the solutions:

I've got the county parcel database and I'm only supposed to label the parcels in my city.

If possible, add an integer field called "InCity" to your parcels dataset, select the parcels that are inside of your city and calculate the field to have a value of 1 (the default value is null or zero). Set your definition query to [InCity] = 1.

The address field is empty for some of my features, and that wrecks the formatting. & My boss wants different formatting for parcels that are larger than one acre.

Both circumstances require custom logic either using an advanced label expression or by creating additional label classes.  The extra label classes method is less complicated, so here are the steps to do that: 

  1. In the label manager, add 3 additional label classes to your parcel layer. I also renamed my default label class to "Small" (by right-clicking on it in the label manager).
  2. Right click on the original label class and choose Copy the parameters and then right-click each of the new label classes and choose Paste Parameters.  Here's what mine looked like:
  3. Set the SQL Query for each of the label classes as follows:
  • Small:  ([Area_Acres] < 1.0) AND ([NWLOCN] IS NOT NULL AND [NWLOCN] <> "")
  • Large:  [Area_Acres] >= 1.0 AND ([NWLOCN] IS NOT NULL AND [NWLOCN] <> "")
  • Small, no address: [Area_Acres] < 1.0 AND ([NWLOCN] IS NULL OR [NWLOCN] = "")
  • Large, no address: [Area_Acres] >= 1.0 AND ([NWLOCN] IS NOT NULL OR [NWLOCN] = "")

Then set the label expressions to:

  • Small: [NWLOCN] & vbCrLf & [BLKLOT] & vbCrLf & [Area_Acres] & " ac"
  • Large: [NWLOCN] & vbCrLf & [BLKLOT] & vbCrLf & "<BOL>" & [Area_Acres] & " ac</BOL>"
  • Small, no address: "No Address" & vbCrLf & [BLKLOT] & vbCrLf & [Area_Acres] & " ac"
  • Large, no address: "No Address" & vbCrLf & [BLKLOT] & vbCrLf & "<BOL>" & [Area_Acres] & " ac</BOL>"
In this case I used <BOL> and </BOL>, which are text formatting tags to make the Acreage bold.

In my label, I need my acreage rounded to just two decimal places.

Before getting to the solution, the vbscript Round() method used in the example label expression for determining acreage is potentially inaccurate depending on the coordinate system of the data.

It's typically better to have an additional field to store data like area in units other than the dataset's coordinate system units. This allows you to calculate the acreage correctly, no matter what coordinate system is being used. Create a field called [Area_Acres] and calculate it using the Calculate Field tool or the Calculate Geometry option the table window (In the calculate geometry field topic, scroll down to near the bottom and find the task called "Calculating area, length, and other geometric properties").

Having the Area_Acres field allows the formatting of information in the field using the Fields tab of the Layer Properties dialog--which addresses not only the map requirement, but will also reduce the processing and time needed to label the parcels.