Shawn Jamal
Shawn Jamal

Reputation: 190

Python Convert Inches and Feet into Inches

I am trying to convert arrays that contain both Inches and Feet into Inches. The feet are denoted with a single quote (') and inches are denoted with double quotes ("). The data comes in the following forms:

[8'x10']
[60\" x 72\"]
[5'x8',5x8,60\"x92\"]
[8'10\"x12']

What I want:

["96x120"]
["60x72"]
["60x96","60x96","60x96","60x92"]
["106x144"]

What I have:

def ft_inch(numbers):
    if str(numbers).find("x") > -1:
        numbers=numbers.replace('[','').replace('"','').replace('[','').replace(']','')
        try:
            nom = numbers.split("x")[0]

            nom=nom.replace(r'\\|\"|\]|\[','')
            nom_one = nom.split("'")[0]
            nom_two = nom.split("'")[1]
            
            den = numbers.split("x")[1]
            den=den.replace(r'\\|\"|\[|\]','')
            den_one = den.split("'")[0]
            den_two = den.split("'")[1]
            
            ft=int(nom_one)*12
            inch=nom_two.replace(r'\"| |\\','')
            try:
                inch=int(inch)
            except:
                print('B')
            tmp = int(ft)+int(inch)
            
            fts=int(den_one)*12
            inchs=den_two.replace(r'\"| |\\','')
            try:
                inchs=int(inchs)
            except:
                print('B')
            tmp_two = int(fts)+int(inch)
            
            return f'["{tmp}x{tmp_two}"]'
        except:
            return numbers
    else:
        return numbers



x="[5'1x8'1]"
ft_inch(x)

This works for a single array as long as it has both feet and inches but fails if its only feet [8'x8']. If anyone has a simpler solution please let me know

Upvotes: 0

Views: 660

Answers (2)

Erik McKelvey
Erik McKelvey

Reputation: 1627

I rewrote the entire thing, but this seems to work:

input_ = ["8'x10'", "60\" x 72\"", "5'x8'","5x8","60\"x92\"", "8'10\"x12'", "8'1x10'1\""]
inches_only = []

for s in input_:
    s.replace(" ", "")
    sides = s.split("x")
    new_sides = []
    for side in sides:
        inches = 0
        split1 = side.split("'")
        if len(split1) > 1 or (len(split1) == 1 and not side.__contains__('"')):
            inches = int(split1[0]) * 12
        split2 = side.split('"')
        if len(split2) > 1:
            inches += int(split2[0].split("'")[-1])
        elif len(split2) == 1 and len(split1) > 1 and len(split1[1]) > 0:
            inches += int(split1[1])
        new_sides.append(str(inches) + '"')
    inches_only.append("x".join(new_sides))
print(inches_only)

Output:

['96"x120"', '60"x72"', '60"x96"', '60"x96"', '60"x92"', '106"x144"', '97"x121"']

Upvotes: 1

mirrorkeydev
mirrorkeydev

Reputation: 78

A regex-based approach:

import re
inputs = [["8'1x10'1"], ["60\" x 72\""], ["5'x8'", "5x8", "60\"x92\""], ["8'10\"x12'"]]

for inpt in inputs:
  sub_output = []
  for measurement in inpt:
    m = re.match(r"(\d+['\"]?)(\d+['\"]?)?x(\d+['\"]?)(\d+['\"]?)?", 
    "".join(measurement.split()))
    groups = [m.groups()[:2], m.groups()[2:]]
    result_inches = [0, 0]
    for i, group in enumerate(groups):
      for raw_val in group:
        if raw_val == None:
          continue
        if '"' in raw_val:
          result_inches[i] += int(raw_val[:-1])
        elif "'" in raw_val:
          result_inches[i] += int(raw_val[:-1])*12
        else:
          result_inches[i] += int(raw_val)*12
    sub_output.append(result_inches)
  print([f"{x}x{y}" for x, y in sub_output])

Output:

['108x132']
['60x72']
['60x96', '60x96', '60x92']
['106x144']

I saw your edit and included the ["8'1x10'1"] case :)

Upvotes: 1

Related Questions