2011-09-19 79 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'的数字格式表亲,但我现在找不到它。 –