2013-09-23 5 views
3

Я пишу веб-интерфейс для инженерного моделирования. Задний конец принимает значения только в единицах, не имеющих префикса СИ, например, в метрах или ваттах. Однако было бы предпочтительнее разрешить пользователю вводить значения в любом устройстве, которое они пожелают. Например, если вам нужно ввести расстояние, можно ввести:javascript инженерная библиотека ввода

15 inches 
3.1 meter 
1.4 km 

, но такие ценности, как:

12 seconds 
5 pounds 
147 watts 

будет отклонено. Сначала я попытался использовать js-quantities, но он не анализирует производные единицы наиболее интуитивным способом. Для каждой единицы умножения требуется место. Например, для ввода суммы заряда в часы усилителя, 100 Ah недействителен, но 100 A h является приемлемым. Кроме того, js-величины не поддерживают единицы крутящего момента или температуры (только разность температур, вы не можете преобразовать Fahrenheit в Цельсию, например)

Затем я попытался использовать API-интерфейс Google Analytics для преобразования единиц измерения, но он производит неудобовразумительные анализирующие результаты для малых чисел:

Преобразовать 5 нм до метров

запрос:

http://www.google.com/ig/calculator?hl=en&q=5%20nm=?m 

ответ:

{lhs: "5 nanometers",rhs: "5.0 \x26#215; 10\x3csup\x3e-9\x3c/sup\x3e meters",error: "",icc: false} 
+1

Конверсии, о которых вы упомянули, не * действительно * необходимо обработать на google calc. Они просто статичны, поэтому вы должны делать их в браузере. Что-то вроде ответа в этом вопросе: http://stackoverflow.com/questions/865590/unit-of-measure-conversion-library – olan

+0

Да, желательно, чтобы они были сделаны в браузере. Я просто ищу службу библиотеки ИЛИ, которая может анализировать единицы таким образом. Я видел вопрос, который вы связали, но он не обрабатывает фактический синтаксический анализ. Кроме того, я не уверен, что могу легко создать исчерпывающий список действительных единиц. – charliehorse55

+0

Hi @ charliehorse55. Я автор js-величин. Я был бы рад исправить проблемы, если это возможно (особенно А-парсинг). Тем не менее, я пробовал tempF для преобразования и крутящего момента tempC, но он работает как ожидалось ((новый Qty ('100 tempF'). To ('tempC')), новый Qty ('N * m')). – gentooboontoo

ответ

2

Мне кажется, что изменение js-величин будет довольно простым.

Вы просто редактируете функцию parse (val) функции. Вы пытаетесь разобрать, и после сбоя вы просто вставляете пробелы, как того требует очень простой набор правил. Вы проходите через строку слева направо и идентифицируете единицы и разделяете строку.

Однако я, вероятно, поеду с другим решением, где вы разделите его уже тогда, когда пользователь вводит его (по тем же правилам). Таким образом, когда пользователь вводит значение, он может показать «использование часов amp» для Ah, и пользователь может видеть, что все так оно и было для него. Таким образом, вы можете предложить пользователю выбрать из списка (или более продвинутого построителя), если это не то, что он имел в виду.

+0

При дальнейшем анализе представляется, что изменять js-величины невозможно, чтобы делать то, что мне нужно. Из-за совпадающих имен блоков запросы, такие как '80 F', могут быть интерпретированы как 80 фарадов или 80 градусов по Фаренгейту. Вероятно, я собираюсь в конечном итоге написать свою собственную библиотеку, которая позволяет пользователю пройти в желаемом модуле вывода, чтобы устранить эти неоднозначности. – charliehorse55

+0

Я думаю, что независимо от библиотеки внизу я бы сделал слой с правилами названия единицы. Чтобы пользователь мог видеть, что это 80Farads, а не Farenheit. и позволить ему переключаться между ними (и, возможно, искать или строить то, что ему нужно по единице). Таким образом, вы все равно можете использовать логику какой-либо предварительно построенной библиотеки, вам просто нужно приклеить дополнительный слой для взаимодействия с ним и вашим пользователем. –

+0

Если пользователь вводит поле (обозначенное как «Температура окружающей среды» для ex), было бы бессмысленно спрашивать их, означают ли они Фарады или Фаренгейт. – charliehorse55

0

Вывод калькулятора Google не кажется слишком сложным для синтаксического анализа.

Я хотел бы сделать что-то вроде этого:

//Parse JSON output to JS variables 
    ret = JSON.parse(JSON.stringify({lhs: "5 nanometers",rhs: "5.0 \x26#215; 10\x3csup\x3e-9\x3c/sup\x3e meters",error: "",icc: false})); 

    //ret = Object {lhs: "5 nanometers", rhs: "5.0 &#215; 10<sup>-9</sup> meters", error: "", icc: false} 
    var lhs = new Object(); 
    //Check if lhs has exp notation 
    if (ret.lhs.search("&#215; ")!==-1) { 
    //If so, conversion is a bit harder...but not much 
    temp = ret.lhs.split("&#215; "); 
    lhs.base = temp[0] 

    temp = temp[1].split("<sup>")[1].split("</sup>"); 
    lhs.exp = temp[0]; 
    lhs.unit = temp[1]; 
    lhs.num = parseFloat(lhs.base)*Math.pow(10,parseFloat(lhs.exp)); 
} else { 
    //If no, piece of cake 
    temp = ret.lhs.split(" "); 
    lhs.num = parseFloat(temp[0]); 
    lhs.unit = temp[1]; 
} 

//Exactly the same for rhs 
var rhs = new Object();  
if (ret.rhs.search("&#215; ")!==-1) { 

    temp = ret.rhs.split("&#215; "); 
    rhs.base = temp[0] 

    temp = temp[1].split("<sup>")[1].split("</sup>"); 
    rhs.exp = temp[0]; 
    rhs.unit = temp[1]; 
    rhs.num = parseFloat(rhs.base)*Math.pow(10,parseFloat(rhs.exp)); 

} else { 
    temp = ret.lhs.split(" "); 
    lhs.num = parseFloat(temp[0]); 
    lhs.unit = temp[1]; 
} 

console.log("Converted",lhs.num,lhs.unit,"to",rhs.num,rhs.unit); 

Выход: Конвертирована 5 нанометров до 5e-9 метров

Так как теперь оба LHS и RHS как числовые яваскрипта переменных и их единицы, как строки, вы можете форматировать/обрабатывать их сколько угодно.

0

Вы посмотрели на mathjs?

http://mathjs.org/

Это не извлекли единицы пока (я не верю), но они работают над этим. Кроме того, это, вероятно, самое близкое к тому, что вы хотите.

Если вам нужна больше функциональных возможностей, характерных для вашей отрасли техники, вам нужно будет расширить библиотеку в какой-то момент.

+0

Хотя это выглядит многообещающим, он не очень хорошо обрабатывает температуры/градусы. Попробуйте выполнить математику по температурам: '2 degC * 2' приводит к чему-то вроде' ((2 degC в degK) * 2) в degC', а не '4 degC' и' 2 degC - 2 degF' приводит к чему-то значительно отличающемуся от падение '2 degF' от' 2 degC'. Кажется, перевод всех температур в относительную величину 0 кельвинов перед выполнением математики и преобразование назад. –

Смежные вопросы