2013-09-23 3 views
3

엔지니어링 시뮬레이션을위한 웹 기반 프런트 엔드를 작성하고 있습니다. 백엔드는 미터 또는 와트와 같은 접두어가없는 SI 단위의 값만 허용합니다. 그러나 사용자가 원하는 단위로 값을 입력 할 수 있도록하는 것이 바람직합니다. 당신이 거리를 입력하는 데 필요한 경우, 예를 들어, 사용자가 입력 할 수자바 스크립트 엔지니어링 입력 라이브러리

15 inches 
3.1 meter 
1.4 km 

하지만 값을 같은 :

12 seconds 
5 pounds 
147 watts 

이 거부 될 것이다. 먼저 js-quantities을 사용해 보았지만 가장 직관적 인 방식으로 파생 된 단위를 구문 분석하지 않습니다. 곱해진 단위 사이에 공간이 있어야합니다. 예를 들어, 앰프 시간 단위로 요금을 입력하려면 100 Ah은 유효하지 않지만 100 A h을 사용할 수 있습니다. 또한 js 수량은 토크 또는 온도 단위를 지원하지 않습니다 (예 : 온도차 만 섭씨로 화씨를 변환 할 수 없습니다).

그런 다음 Google 계산기 API를 사용하여 단위 변환을 시도했지만 적은 수의 하드 구문 분석 결과 :

변환 미터

요청에 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 계산에 포함되지 않아도됩니다. 그것들은 단지 정적이어서 브라우저에서해야합니다. 이 질문에 대한 답변과 같은 것 : http://stackoverflow.com/questions/865590/unit-of-measure-conversion-library – olan

+0

예, 브라우저에서 완료하는 것이 좋습니다. 이런 식으로 유닛을 파싱 할 수있는 라이브러리 또는 서비스를 찾고 있습니다. 내가 링크 된 질문을 보았지만 실제 구문 분석을 처리하지 못합니다. 또한 유효한 단위의 철저한 목록을 쉽게 만들 수 있는지 확신 할 수 없습니다. – charliehorse55

+0

안녕하세요 @ charliehorse55. 저는 js- 수량의 저자입니다. 가능하다면 문제를 해결하게되어 기쁩니다 (특히 Ah 파싱). 그럼에도 불구하고 tempC를 tempC 변환 및 토크 수량으로 시도했지만 예상대로 작동합니다 (새로운 Qty ('100 tempF'). ('tempC')), 새로운 Qty ('N * m')). – gentooboontoo

답변

2

js 수량을 수정하는 것이 매우 쉽습니다.

간단히 함수 구문 분석 (val) 함수를 편집하십시오. 구문 분석을 시도한 후에 매우 단순한 규칙 집합에서 필요에 따라 공백을 삽입하면됩니다. 왼쪽에서 오른쪽으로 문자열을 이동하고 단위를 식별하고 문자열을 분할합니다.

그러나 사용자가 입력 할 때 (이미 같은 종류의 규칙에 따라) 이미 다른 솔루션으로 갈 것입니다. 그렇게하면 사용자가 값을 입력 할 때 Ah에 대해 "앰프 시간 사용"을 표시 할 수 있으며 사용자는 모든 것이 그가 의도 한대로라는 것을 알 수 있습니다. 그렇게하면 사용자가 의미하는 바가 아니더라도 사용자가 목록 (또는 고급 빌더)에서 선택하도록 사용자에게 제공 할 수 있습니다.

+0

더 자세한 분석 결과, 필요한만큼 js 수량을 수정할 수없는 것으로 보입니다. 단위 이름이 중복되어 '80 F'와 같은 검색어는 80 패러 드나 80 화씨로 해석 될 수 있습니다. 아마도 사용자가 원하는 출력 단위를 전달하여 이러한 모호성을 해결할 수있는 자체 라이브러리를 작성하게 될 것입니다. – charliehorse55

+0

아래 라이브러리가 아무리해도 유닛 이름 규칙이 적용된 레이어를 만들었습니다. 그래서 사용자는 Farenheit가 아닌 80Farads라고 쓰는 것을 볼 수 있습니다. (그리고 어쩌면 그가 단위별로 필요로하는 것을 검색하거나 구축 할 수 있습니다.) 이 방법을 사용하면 여분의 레이어를 인터페이스에 추가하기 위해 필요한 미리 빌드 된 라이브러리의 논리를 사용할 수 있습니다. –

+0

사용자가 필드 (예 : "Environment Temperature"라고 표시되어 있음)에 들어가는 경우, Farads 또는 Fahrenheit을 의미하는지 묻는 것은 의미가 없습니다. – 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 미터

지금 좌와 우 숫자 자바 스크립트 변수로 그들의 단위로 모두를 가지고 있기 때문에

나는 같은 것을 할 것 문자열을 사용하면 원하는만큼 형식을 지정/처리 할 수 ​​있습니다.

0

mathjs를 보았습니까?

http://mathjs.org/

그것은 아직 단위를 유도하지 않는다 (나는 생각하지 않는다)하지만 그들은 그것을 위해 노력하고 있습니다. 그것보다 아마 당신이 원하는 것과 가장 가까운 것일 겁니다.

엔지니어링 업계 고유의 기능이 더 필요하면 언제든지 라이브러리를 확장해야합니다.

+0

이것은 유망 해 보이지만 온도 /도를 잘 처리하지 못합니다. 온도에서 수학 해 봅니다. '2 degC * 2'는'(2 degC in degK) * 2)'degC'보다는'4 degC'와'2 degC - 2 degF'와 같은 결과를 가져옵니다. '2 degC'에서'2 degF' 하락. 수학을하고 다시 변환하기 전에 모든 온도를 0 켈빈 상대 값으로 변환하는 것으로 보입니다. –