So a little while ago, someone in the discussion group asked how to go about dropping the zeros at the end of a label. For example, if a value was 100.1111, they wanted to see 100.111. If the value was 100.0001, they wanted to see 100. Apply this to the entire range and you get an idea of what was wanted;

One Label Style, Different Precisions

One Label Style, Different Precisions

In the image above, you can see the total length of the line in the component on the bottom and the component on the top is displaying with different precision based on the value of the label.

NOTE:¬†The method I came up for solving this issue only works if the values can never be negative. If the values you are labeling can be negative (such as a surface elevation) this technique won’t work

Setting Up the Style

What you’ll need: 1 component for each precision you’ll want in the label and one expression for each of those. I’ll start this off by creating the component if the label rounds to the nearest ones place.

The expression basically does this: It checks to see if the number is the same when rounded to the nearest one and when it’s rounded to the nearest one thousandth. If they are the same, return the value. If they are different, return -1 (negative¬†one). The expression will look like this (for a line label):
IF(ROUND({General Segment Length})=ROUND({General Segment Length}*1000)/1000,{General Segment Length},-1)

Expression for Display to the Ones Place

Expression for Display to the Ones Place

I called this expression “ones”.

Now use this expression within a label component. Instead of using the length of the line in the label, use this expression. The trick here is to change the precision to the ones place and then set the “Sign” value to “hide negative value”. That’s what the -1 is used for. If the test in the expression is false, then don’t display anything, if it’s true, display the value at a precision of 1.

Label Component Used to Display the Ones Place

Label Component Used to Display the Ones Place

Repeat the expression/component process for the rest of the precisions you want to use in the label (tip: just copy the “ones” component for the rest of them). For the tenths place, add an additional IF statement to the expression. If the “ones” expression is greater then or equal to zero, then return -1, otherwise, test for the next precision. This expression looks like this:
IF(ones>=0,-1,IF(ROUND({General Segment Length}*10)/10=ROUND({General Segment Length}*1000)/1000,{General Segment Length},-1))

Expression for Display to the Tens Place

Expression for Display to the Tens Place

The expression for the hundredths place is very similar but with an extra IF statement to check both the “ones” and “tenths” expressions.

Finally, you’ll need one last expression for everything else. This one is really simple, basically, if “ones” is greater then 0 or if “tens” is greater then 0 or if “hundreds” is greater then 0 then return -1. Otherwise, return the value.

IF(ones>=0,-1,IF(tens>=0,-1,IF(hundreds>=0,-1,{General Segment Length})))

Expression for Display to the Thousands Place

Expression for Display to the Thousands Place

Wrap Up

Once you have the expressions created and added to your label, it works like a charm. HERE is a quick little video I made showing the expression at work. I took a line and labeled it and then changed the length of the line using the dynamic input.

Additionally, if you would like a copy of the file that I showed in the video, you can download it HERE.

Have fun playing with your new label knowledge!

About these ads