6

I am just learning python and I need to convert a 2 digit numeric attribute in a table to a 2 digit zero-filled attribute in a script.

For example, 9 needs to be 09.

2
  • 3
    If your field is numeric field you will have to create a new text field to do this. Also, what version of ArcGIS are you using?
    – artwork21
    Commented Feb 6, 2013 at 15:36
  • Thanks I am using 10.0 and the zfill worked for me. I'm an old dog learning new tricks much apprecaited. Commented Feb 13, 2013 at 14:29

3 Answers 3

6

See the zfill() help in python.org or this stackoverflow post. As @artwork mentions, you must convert the value to string and make the calculation. You can use zfill() inside the cursor, or use as an expression in the Calculate Field tool.

2
  • 2
    Good suggestion! n = 4 or n = 40 followed by print str(n).zfill(2) will return the correctly padded values. Commented Feb 6, 2013 at 22:48
  • 1
    Here is the syntax to use in a Calculate Field expression: str(!NUM_ID!).zfill(2) -- where NUM_ID is your source field.
    – blah238
    Commented Feb 7, 2013 at 12:18
2

If you already have a value and you need to make it 2 digit value, have a look:

import sys

inputValue = sys.argv[1]
checkValue = int(inputValue)

if checkValue <= 9:
    inputValue = '0' + inputValue
print inputValue

input->output: 2 -> 02, 20 -> 20

1
  • 1
    While this will work, the built-in functions zfill or rjust make much more sense.
    – blah238
    Commented Feb 7, 2013 at 6:44
2

This should do the trick (if using ArcGIS 10.1, for ArcGIS 10 you will have to use this update cursor):

  1. First add a empty text field, e.g. textField to your feature class or shapefile.

  2. You can run the below code in PythonWin, ArcMap, or ArcCatalog Python window. Or put it into a .py file and call it from a user created toolbox script tool.

Updated:

    import arcpy

    fc = "C://temp//Default.gdb//myLayer" # update to your layer
    fields = ('numField', 'textField') # put your numeric and text field here
    with arcpy.da.UpdateCursor(fc, fields) as cursor:
        for row in cursor:
            if row[0] <= 9:
                row[1] = '0' + str(row[0])
                cursor.updateRow(row)
2
  • 3
    I don't think this will work if the number is already 2 digits (10 - 99)? I think you will end up with a padded '010' or '099' when the user actually wants '10' and '99' if the number is already 2 digits long? Commented Feb 6, 2013 at 22:44
  • Updated my answer, thx.
    – artwork21
    Commented Feb 7, 2013 at 11:36

Your Answer

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

Not the answer you're looking for? Browse other questions tagged or ask your own question.