Я разрабатываю приложение калькулятора , которое также позволяет конвертировать единицы . Для этого я хочу предоставить возможность не только конвертировать между произвольными (измерениями) единицами, но также и между произвольными составными единицами, такими как km/h
до m/s
. Во-первых, позвольте мне начать с имеющейся у меня структуры, чтобы вы понимали настройку.
У меня есть все единицы измерения и преобразования, указанные в файлах конфигурации, чтобы дать пользователю возможность расширить систему дополнительными единицами. Общий макет файлов (здесь они заключены в один) выглядит следующим образом:
# This is a comment.
# Unit declaration
# Name Dimension Aliases
meter 1 Metre, metre, m
foot 1 ft, feet
second 1 s,sec
hour 1 h
# Prefix
# Name Alias Base Exponent
centi c 10 -2
kilo k 10 3
# Conversion
foot 30.48cm
hour 3600sec
Затем все они переносятся в типы / объекты для обработки. Поиск «прыжков» между произвольными единицами полностью реализован, это означает, что система уже может найти путь для преобразования между единицами, которым не назначено прямое преобразование. Например, я мог указать только час, равный 60 минутам, и минуту, равную 60 секундам, и система могла бы преобразовать 1 час в 3600 секунд. Это все работает. Также полностью работает поддержка префиксов.
Моя проблема начинается с преобразования единиц, которые не состоят из простого фактора, например преобразования температуры:
celsius (x * (9/5) + 32)°F
fahrenheit ((x - 32) * (5/9))°C
Как вы можете видеть, я уже иметь систему, которая позволяет размещать произвольные формулы для преобразования с x
в качестве числа для преобразования. Теперь основной проблемой являются сложные единицы, например, когда я хочу преобразовать km/h
в ft/s
. Мой текущий подход заключается в следующем (предупреждение, не для слабонервных) :
- Разделить составной блок на его компоненты:
km
и h
, ft
и s
- Сопоставьте единицы друг с другом:
km
и ft,
h and
s` - Получите формулу из этой точки:
- Конвертируйте все префиксные единицы в их базы:
km
в 1000m
- Получите коэффициент преобразования между единицами и поместите его в формулу.
Это дает ((1 * 1000) * 3.28) / (3600)
как формулу деривации и примерно 0.911...
коэффициент, который я затем использую для преобразования данного значения в ft/s
. Пока все хорошо.
Теперь, когда мы вспомним о температурных преобразованиях, весь этот подход разваливается, потому что я использую 1
в качестве значения в формуле. Предполагая, что я хочу преобразовать C/s
в F/h
В настоящее время я получаю формулу (1 * (9/5) + 32) / (0.0002777)
и использую полученный коэффициент для преобразования, что явно неверно.
Мой второй подход заключался в вставке значение (предположим, 9
) при каждом преобразовании единицы, что дает мне (9 * (9/5) + 32) / (9 * 0.0002777)
, что также не является правильным решением. Я имею в виду, что случай таких температурных преобразований тоже намного сложнее. Так что с моей стороны все еще существует определенный пробел в знаниях.
Я в полном недоумении, и мне трудно найти ресурсы или решения этой проблемы. Может кто-нибудь пролить свет на то, как это сделать правильно?