Как правильно переводить единицы измерения на лету?

Доброго времени суток. Использую jQuery. У меня есть несколько инпутов с единицами измерения массы. Я хочу при вводе в любом из инпутов, автоматически считать и выводить в значение инпутов результат.
Например ввёл в инпут с килограммами цифру 1, а он сразу посчитал для всех других единиц сколько будет 1 кг в этих единицах.
Сам функционал работает как надо, но вот не пойму, почему с некоторыми единицами идут не правильные расчёты, вернее не пойму как сделать, чтобы работало правильно.

Например если ввожу 1 кг, то для грамм, центнеров и для тонн он показывается правильное значение, а для килотонны он показывает 1000000, но 1 кг не равен такого количеству килотонн.
Или ввожу 1 Миллиграмм он мне считает это как 1 тонну и т.д.

Не пойму как правильно настроить рассчёты в зависимости от того, в какой инпут что ввели. Помогите пожалуйста решить.
$(document).ready(function () {
    const conversionFactors = {
        "Килограммы": 1,
        "Граммы": 1000,
        "Тонны": 0.001,
        "Центнер": 0.01,
        "Миллиграмм": 1000000,
        "Сантиграмм": 10000,
        "Микрограмм": 1000000000,
        "Килотонна": 1000000,
        "Ньютон на Земле": 9.81,
        "Карат": 5000,
        "Атомная масса": 1.66e-27 * 1000,
        "Фунт": 2.20462,
        "Унция": 35.274,
        "Гран": 15432.4,
        "Стоун": 0.157473,
    };

    function updateUnitValues(sourceElement, sourceValue) {
        const parentRow = sourceElement.closest(".row.align-items-center");
        const sourceLabel = parentRow.find(".custom-label").text();

        const conversionFactor = conversionFactors[sourceLabel];
        if (typeof conversionFactor === "undefined") {
            $("input[type='text']").val("0");
            return;
        }
        const weightValue = sourceValue * (1 / conversionFactor);

        $("input[type='text']").each(function () {
            const targetLabel = $(this).closest(".row.align-items-center").find(".custom-label").text();
            const targetConversionFactor = conversionFactors[targetLabel];
            if (typeof targetConversionFactor === "undefined") {
                $(this).val("0");
            } else {
                const targetValue = weightValue * targetConversionFactor;
                $(this).val(targetValue.toString().match(/^-?\d+(?:\.\d{0,15})?/)[0]);
            }
        });
    }

    $("input[type='text']").on("input", function () {
        const sourceValue = parseFloat($(this).val().replace(",", "."));
        if (!isNaN(sourceValue)) {
            updateUnitValues($(this), sourceValue);
        } else {
            $("input[type='text']").val("");
        }
    });
});
  • Вопрос задан
  • 81 просмотр
Пригласить эксперта
Ответы на вопрос 1
Rsa97
@Rsa97
Для правильного вопроса надо знать половину ответа
Переводить из введённого значения в единицы СИ, затем из СИ во все остальные значения. Соответственно, в первой части надо умножать на коэффициент, во второй делить на коэффициенты.
1 тонна = 1 * 1000 = 1000 кг
1000 кг = 1000 / 0.001 = 1000000 г
1000 кг = 1000 / 1000000 = 0.001 килотонны
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы