2011-09-19 81 views
2

在我的應用程序中,我編輯了文本框,其中用戶輸入應用程序用來運行計算的十進制值。區域獨立字符串加倍

其他地區的某些用戶在輸入數字時會報告問題,例如輸入值和出現的不同值。我試圖通過獲得來自EDITTEXT值用這種方法來解決這個問題:

public double stringToDouble(String s){ 
     if (nf == null){ 
      nf = NumberFormat.getInstance(Locale.US); 
     } 
     try { 
      return nf.parse(s).doubleValue(); 
     } catch (ParseException e) { 
      e.printStackTrace(); 
      return 0.0; 
     } 
    } 

val = stringToDouble(et.getText().toString()); 

但顯然仍是不工作的一些人。在斯洛文尼亞

一個用戶報告說,它工作正常,如果

  • 設置;語言&鍵盤:
  • 選擇語言:設置爲英語(斯洛文尼亞)
  • 觸摸輸入:僅設置爲英語和任何語言(我的情況 斯洛文尼亞)
  • 雙語預測:OFF
  • 文本預測:OFF

獲取double值的正確方法是什麼? 感謝

+0

是因爲有些國家使用逗號而不是點數來表示小數? –

+0

我認爲這與它有關。但是,當我使用上面的雙字符串方法與「2,2」時,它返回一個值爲2.2的double,所以我認爲它工作。 – Matt

+0

看看這是否有幫助http://stackoverflow.com/questions/4323599/best-way-to-parsedouble-with-comma-as-decimal-separator –

回答

7

從外觀上來看,做正確的做法是:

public double stringToDouble(String s){ 
     if (nf == null){ 
      nf = NumberFormat.getInstance(Locale.getDefault()); 
     } 
     try { 
      return nf.parse(s).doubleValue(); 
     } catch (ParseException e) { 
      e.printStackTrace(); 
      return 0.0; 
     } 
    } 

到目前爲止,這似乎是爲我工作。

+0

緩存你的'NumberFormat'實例是好的,只要' stringToDouble()'不會被多個線程同時調用,因爲'NumberFormat'不是線程安全的。 –

+0

謝謝,我不知道。我應該使用NumberFormat.getInstance(Locale.getDefault())。parse(s).doubleValue();代替? – Matt

+0

要麼是(最簡單的解決方案,首選),要麼是在某個'private final new Object()'字段上同步至少對'nf.parse()'的調用(只有在它被證明是一個瓶頸之後)。也許甚至有Common Lang的線程安全的'FastDateFormat'的數字格式表親,但我現在找不到它。 –