Я использую mathjs (https://mathjs.org), чтобы сделать некоторые вычисления, включая различные единицы. Значения, включенные в вычисления, взяты из пользовательского ввода (числовой ввод и выборочный ввод для единицы). Для сравнениярезультаты, мне нужно преобразовать результаты в одну и ту же единицу.
Простой пример:
var calculation = "userInput * 5"
var userInput = "50kg"
var result = math.evaluate(calculation.replace("userInput",userInput))
var displayResult = math.unit(result).to("g").format({lowerExp: -10, upperExp: 10})
console.log("displayResult",displayResult) //returns 250000 g
Пока все хорошо. Когда единица состоит из разных единиц, однако это становится сложным:
var userDist = "50 km" //could be in m, km, miles, inches, etc
var userTime = "1h" //could be in h, d, s, m, etc
var calculation = "userDist/userTime"
var result = math.evaluate(calculation.replace("userDist",userDist).replace("userTime ",userTime ))
var displayResult = math.unit(result).to("m/s").format({lowerExp: -10, upperExp: 10})
console.log("displayResult",displayResult)
В этом случае я должен знать, что единица вывода будет distance/time
, чтобы преобразовать его в m/s
.
Теперь дело в том, что вычислениеможет стать очень сложным, будучи самим пользовательским вводом и включая результаты предыдущих вычислений. Так что нет никакого способа не знать, какой ожидаемой единицей будет . У меня есть только начальные единицы из пользовательского ввода.
Поскольку вполне вероятно, что в расчетах будут смешиваться разные единицы измерения (площади, расстояния, веса, валюты и т. Д.), Я хотел бы иметь возможность преобразовать начальные значения. нг единицы измерения (пусть пользователь сам решает, какую единицу измерения он хочет видеть, например, расстояния и площади всегда должны быть в метрах, время всегда в секундах) и, следовательно, должен преобразовывать их одну за другой. например что-то вроде:
var userDist = "50 km" //could be in m, km, miles, inches, etc
var userTime = "1h" //could be in h, d, s, m, etc
var calculation = "userDist/userTime"
var result = math.evaluate(calculation.replace("userDist",userDist).replace("userTime ",userTime ))
//transform first km to m
var displayResult = math.unit(result).to("m")
//transform h to s
displayResult = displayResult.to("s")
//formatting output
displayResult = displayResult.format({ lowerExp: -10, upperExp: 10 })
console.log("displayResult", displayResult)
Это, однако, выдает ошибку. Я пытался преобразовать начальные единицы перед вычислением, но результат довольно случайный. Я играл некоторое время, но не мог найти решение. Кто-нибудь знает обходной путь к этой проблеме? Я не могу быть единственным, кто сталкивается с этим.