Forum Archive

Adding up measurements

Jozh

I often make a list of measurements in feet and inch. Then have to pull my calculator to add them all up. Is there a way to build the workflow to do this for me?

Input:
5' 6"
3' 8"

Output:
9' 2"

Discussion started with RV: Forums New Discussion workflow

omz

Here's a fairly simple regex-based Python script/workflow:

→ Add up Measurements

For simplicity's sake, it only supports integers, but extending it to handle floating-point values wouldn't be very difficult (wasn't sure if you'd actually need it).

Jozh

Thank you that's almost exactly what I was looking for.

Jozh

What would it take to add fractions to the script and what would it have to be 8.5" or 8 1/2".
Thanks

ccc

feet_and_inches() can be expressed in just a few lines of code for floating point values. I will have to think a bit more to deal with fractions.

# coding: utf-8

def feet_and_inches(s='''5.5' 6.5" 3.6' 8.6"'''):
    inches = sum(float(x.replace("'", '')) * 12 if "'" in x
            else float(x.replace('"', '')) for x in s.split())
    return '{:g}\' {:g}"'.format(inches // 12, inches % 12)

if __name__ == '__main__':
    test_data = '''5' 6"
                   5' 6" 3' 8"
                   5' 6.5" 3' 8.5"
                   5.5' 6" 3.5' 8"
                   5.5' 6.5" 3.5' 8.5"
                   5.5' 6.5" 3.5' 8.6"
                   5.5' 6.5" 3.6' 8.6"'''.splitlines()
    print('=' * 20)
    for line in test_data:
        print('{:>19} ==> {}'.format(line.strip(), feet_and_inches(line)))
ccc

I believe that this version deals with all the cases but I would not be shocked if there were problems...


#!/usr/bin/env python
# coding: utf-8

from __future__ import (absolute_import, division, print_function, unicode_literals)

def fractions_to_floats(s):
    frac_part = ''
    output = []
    for x in reversed(s.split()):  # processing terms from right to left
        a, _, b = x.partition('/')
        if b:
            frac_part = '{}{}'.format(int(a) / int(b.strip('\'"')), b[-1])
        else:
            if x[-1] in '\'"':
                output += [x, frac_part]
            else:
                output.append(x + frac_part.lstrip('0'))
            frac_part = ''
    output.append(frac_part)
    return ' '.join(output)

def feet_and_inches(s='''5.5' 6.5" 3.6' 8.6"'''):
    if '/' in s:
        s = fractions_to_floats(s)
    assert '/' not in s, 'fractions_to_floats() failed: ' + s
    inches = sum(float(x.replace("'", '')) * 12 if "'" in x
            else float(x.replace('"', '')) for x in s.split())
    return '{:g}\' {:g}"'.format(inches // 12, inches % 12)

if __name__ == '__main__':
    test_data = '''
        0
        1
        6"
        13
        14"
        5'
        4' 1' "4
        4' 5" 1'
        5' 6"
        5' 6" 1"
        5' 6" 3' 8"
        5' 6.5" 3' 8.5"
        5.5' 6" 3.5' 8"
        5.5' 6.5" 3.5' 8.5"
        5.5' 6.5" 3.5' 8.6"
        5.5' 6.5" 3.6' 8.6"
        15 1/64"
        15 1/32"
        15 1/16"
        15 1/8"
        15 1/4"
        15 1/2"
        0' 1" 2' 3" 4' 5" 6 7/8"
        15 1/16'
        15 1/8'
        15 1/4'
        15 1/2'
        16' 2 1/16"
        16' 2 1/8"
        16' 2 1/4"
        16' 2 1/2"
        16 1/2' 2 1/16"
        16 1/2' 2 1/8"
        16 1/2' 2 1/4"
        16 1/2' 2 1/2"
        16' 1' 2 1/16"
        16' 1' 2 1/8"
        16' 1' 2 1/4"
        16' 1' 2 1/2"
        16.5' 1' 2 1/16"
        16.5' 1' 2 1/8"
        16.5' 1' 2 1/4"
        16.5' 1' 2 1/2"'''.splitlines()
    print('=' * 20)
    for line in test_data:
        print('{:>24} ==> {}'.format(line.strip(), feet_and_inches(line)))
Jozh

Thank you for your time. How would you add that first code to this code?

import editor
import re

def main():
    text = editor.get_selected_text()
    feet = sum(int(x) for x in re.findall(r"(\d+)'", text))
    inches = sum(int(x) for x in re.findall(r'(\d+)"', text))
    if not (feet or inches):
        return
    feet += (inches / 12)
    inches %= 12
    replacement = '%i\' %i"' % (feet, inches)
    start, end = editor.get_selection()
    editor.replace_text(start, end, replacement)

main()
ccc
from __future__ import division
import editor

# <put the fractions_to_floats() and feet_and_inches() code here>

def main():
    text = editor.get_selected_text()
    if text:
        start, end = editor.get_selection()
        editor.replace_text(start, end, feet_and_inches(text))

main()