0

I'm having trouble rounding a percentage number using a label expression in Python. Just displaying the label as shown below is fine.

def FindLabel ( [Deaths], [PercentageDead] ):
 if ([Deaths]) == "0":
 return [Deaths]
 else:
 return [Deaths] + "\n" + [PercentageDead] + "%" 

I tried implementing the example given on Arcgis online but as soon as I try to round off the extra digits in my percentage all of those features go blank on my map. No label is displayed whatsoever for those feature.

def FindLabel ( [Deaths], [PercentageDead] ):
 if ([Deaths]) == "0":
 return [Deaths]
 else:
 P = round(float([PercentageDead]), 5)
 return [Deaths] + "\n" + P + "%" 

I've tried converting to a float or an int, and than converting it back to a string but nothing seems to work. If I try to manipulate that field whatsoever the expression will return nothing.

I just want to round off the digits to 5, how would I do that? I'd be willing to switch to Arcade if it would yield the same result.

asked May 4, 2020 at 1:17

1 Answer 1

1

Your P variable is a number and you're attempting to use the + operator with a number and strings. You cannot do this. You can + two strings or two numbers, but not a string and a number.

There are a few alternatives that you could try. My preference is to use the string format() function to do variable interpolation. It will convert numbers to strings on the fly.

Eg: return "{}\n{}%".format([Deaths], P)

This also has the advantage that it will not fail, even if there is a NULL (None) value, or some other unexpected data type. It will even convert that to a string, so at least you can see where the problem might be.

UPDATE (to address your comment):

The behaviour you've described in your comment is consistent with being unable to convert the string to a float (eg, because it has non-numeric characters in it).

You could wrap this in a try: block to test it, something like:

try:
 pDead = float([PercentageDead])
except:
 return "{}\nFAILED to convert '{}' to float!!!".format([Deaths], [PercentageDead])
P = round(float(pDead), 5)
return "{}\n{}%".format([Deaths], P)
answered May 4, 2020 at 1:52
4
  • As it turns out the error might be coming from the P declaration. Wherever I put it the code will stop executing at that exact line. Putting it at the top results in all labels being blank. Any ideas? Commented May 4, 2020 at 2:00
  • What field type is your PercentageDead field? Is there any chance it is a string type that includes a % symbol? The behaviour you've described is consistent with being unable to convert the string to a float because it has non-numeric characters in it. Commented May 4, 2020 at 2:19
  • I had actually fiddled with the field type and forgot about it, setting it back to numeric makes it all work great! If I did set the field type back to percentage, how would I ignore the % character when rounding it? Commented May 4, 2020 at 2:25
  • In a string you can replace instances of a substring "%" with an empty string, "", like: float( [PercentageDead].replace("%", "") ) Commented May 4, 2020 at 2:27

Your Answer

Draft saved
Draft discarded

Sign up or log in

Sign up using Google
Sign up using Email and Password

Post as a guest

Required, but never shown

Post as a guest

Required, but never shown

By clicking "Post Your Answer", you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.