如何使用特定的语言环境在Java中将String转换为Double?

Dan*_*ral 38 java localization

我想将我得到的一些数字转换为双打,但这些数字不是美国标准语言环境,而是另一个数字.我怎样才能做到这一点?

Mic*_*ers 64

试试java.text.NumberFormat.来自Javadocs:

要格式化不同Locale的数字,请在对getInstance的调用中指定它.

NumberFormat nf = NumberFormat.getInstance(Locale.FRENCH);
Run Code Online (Sandbox Code Playgroud)

您还可以使用NumberFormat来解析数字:

myNumber = nf.parse(myString);
Run Code Online (Sandbox Code Playgroud)

parse()返回Number; 所以要得到一个double,你必须打电话myNumber.doubleValue():

    double myNumber = nf.parse(myString).doubleValue();
Run Code Online (Sandbox Code Playgroud)

注意parse()永远不会返回null,所以这不会导致NullPointerException.相反,如果失败则parse抛出一个检查ParseException.

编辑:我原来说有另一种转换方式double:将结果转换为Double并使用拆箱.我认为,由于NumberFormat正在使用的通用实例(根据Javadocs getInstance),它总是会返回一个Double.但DJClayworth指出,Javadocs parse(String, ParsePosition)(被称为parse(String))表示Long如果可能的话返回a .因此,投射结果Double是不安全的,不应该尝试!
谢谢,DJClayworth!

  • 请注意法语,因为FR_fr语言环境使用非中断空格(U + 00A0)作为分组分隔符.这使得文本看起来像分隔符是"常规"空间(U + 0020)(例如,标准键盘空间)一样.结果是静默失败,其中看起来格式正确的数字字符串如"3 141,59"被解析为3而不是3141.59.必须将字符串指定为"3\u00A0141,59"才能正确解析.此外,最好将该方法与ParsePosition一起使用,并在解析后检查ParsePosition.getIndex()== inputString.length(). (8认同)

Jas*_*oor 7

NumberFormat是可行的方法,但是当你的数据小于100%正确时,你应该意识到它的特殊性.

我发现以下有用的信息:

http://www.ibm.com/developerworks/java/library/j-numberformat/index.html

如果您的输入可以信任,那么您不必担心它.


lyt*_*Laz 5

刚学java和编程。有类似的问题。在我的教科书中找到了这样的东西:

Scanner sc = new Scanner(string);
double number = sc.nextDouble();
Run Code Online (Sandbox Code Playgroud)

这本书说扫描器会自动解码字符串变量中的内容,并且 Scanner 类会自动适应设置的语言环境,系统语言环境是默认设置,但很容易设置为其他内容。

我这样解决了我的问题。也许这可以解决上述问题而不是解析?

补充:我喜欢这种方法的原因是,当使用 Swing 对话框进行输入,然后尝试使用解析将字符串转换为 double 时,我得到了一个 NumberFormatException。原来 parse 只使用 US-number 格式,而 Scanner 可以处理所有格式。即使使用逗号 (,) 小数点分隔符,扫描仪也使输入工作完美无缺。由于投票最多的答案使用 parse 我真的不知道它会如何解决这个特定问题。您必须以美国格式输入您的数字,然后将它们转换为您的语言环境格式。当数字键盘带有逗号时,这很不方便。

现在你们都可以把我撕成碎片了 ;)

  • java.util.Scanner 的注释(至少在 Android Studio 中)有点有趣...... `一个解析器,在正则表达式的帮助下解析原始类型和字符串的文本字符串。这个类并不像看起来那么有用。机器之间的通信非常低效;为此,您应该使用 JSON、protobufs 甚至 XML。使用 String#split 可能会非常简单的使用。对于来自人类的输入,使用特定于语言环境的正则表达式不仅成本高昂,而且有些不可预测。` (2认同)