2013-09-23 25 views
3

我正在編寫基於Web的工程模擬前端。後端僅接受非前綴SI單位的值,例如米或瓦。不過,最好允許用戶輸入他們希望的任何單位的值。例如,如果你需要輸入一個距離,你可以輸入:javascript工程輸入庫

15 inches 
3.1 meter 
1.4 km 

但值,例如:

12 seconds 
5 pounds 
147 watts 

將被拒絕。我第一次嘗試使用js-quantities,但它不以最直觀的方式解析派生單位。它需要在每個相乘單元之間放置一個空間。例如,要輸入安培小時的電量,100 Ah是無效的,但可以接受100 A h。此外,js-quantity不支持扭矩或溫度單位(只有溫度差異,例如華氏溫度不能轉換爲攝氏溫度)

然後我試着用谷歌計算器API做單位轉換,但它產生難以解析結果爲小的數字:

轉換5nm至米

請求:

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

Hi @ charliehorse55。我是js-quantities的作者。如果可能的話,我會很樂意解決這些問題(尤其是解析)。儘管如此,我嘗試tempF到tempC轉換和扭矩量,但它按預期工作((新的數量('tempF')。到('tempC')),新的數量('N * m'))。 – gentooboontoo

回答

2

在我看來,修改js-數量會相當容易。

您只需編輯函數分析(val)函數。 您嘗試解析,失敗後只需按非常簡單的規則集的要求插入空格。 您將從左到右穿過字符串並確定單位並拆分字符串。

但是,我可能會用另一種解決方案,當用戶輸入它時(通過相同類型的規則),您已經將其拆分。通過這種方式,當用戶輸入一個值時,它可以顯示「使用安培小時」,用戶可以看到一切都是他的意思。這樣你就可以讓用戶從列表中選擇(或更高級的構建器),如果這不是他的意思。

+0

經過進一步分析,似乎不可能修改js-quantity來做我所需要的。由於單元名稱重疊,「80F」等查詢可能會被解釋爲80法拉或80華氏。我可能最終會編寫我自己的庫,允許用戶傳入所需的輸出單位,以解決這些歧義。 – charliehorse55

+0

我認爲,不管下面的圖書館,我會用單位名稱規則做一個圖層。這樣用戶在寫作時可以看到它是80法拉而非華氏。並允許他在他們之間切換(也許搜索或建立他需要的單位)。這樣,您仍然可以使用某個預建庫的邏輯,只需添加一個額外圖層即可與它和您的用戶進行交互。 –

+0

如果用戶正在進入一個領域(例如,標記爲「環境溫度」),詢問他們是否意味着法拉或華氏度是沒有意義的。 – charliehorse55

0

谷歌計算器的輸出似乎不太難分析。

我會做這樣的事情:

//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爲數字的JavaScript變量及其單位字符串,你可以儘可能多地格式化/處理它們。

0

你看過mathjs嗎?

http://mathjs.org/

它沒有衍生的單元,但(我不相信),但他們正在做這個工作。除此之外,它可能是最接近你想要的東西。

如果您需要更多針對您的工程行業的特定功能,您需要在某個點上擴展庫。

+0

雖然這看起來很有希望,但它不能很好地處理溫度/度數。嘗試在溫度上進行數學運算:'2攝氏度* 2'的結果類似於'((2攝氏度,degK)* 2)以攝氏度而不是4攝氏度「和」2攝氏度 - 2攝氏度「從2攝氏度下降2度。它似乎將所有的溫度轉化爲0開爾文的相對值,然後再進行數學運算並轉換回來。 –