JAVA国际化问题

在应用中有这样一段代码:

public float caculatePercent(float percent) {
  DecimalFormat df = new DecimalFormat("0.0");
  String formatedStr = df.format(percent);
   Float.valueOf(formatedStr);
}

先不考虑这段代码是否合理,反正应用中出现了。。然后应用在使用过程都是正常的,然而,突然有一天,qa说,崩溃了!

为什么之前都好好的,现在会崩溃?

qa反馈,在“印尼”语言环境下进行测试会崩溃,然而中文环境下正常。

手机设置中,切换语言环境到印尼(Bahasa Indonesia),这里千万要记住语言设置所在的位置,不然切换到印尼语之后,语言再也切不回来,不要怪我。

启动应用,执行到相应地方,果然崩溃了。抓取崩溃日志,捕获NumberFormatException,“100,0”不能被转成float!

看到这里,有点懵,为什么会有一个逗号!?

现在问题很明确,是由于这个逗号导致valueOf调用时奔溃,而在中文环境下是正常的,所以问题定位在df.format的时候,为什么会把float中的小数点变成逗号而不是我们平时用的句点。

此处省略n多字,参见:http://zhidao.baidu.com/link?url=sVh0RUMAbKhwJjRg1Xwr9owx4PNOeQ4rLe4UiEOfDDQTdJUmAiW_q82WVdTHv1xbj7qmPcL8ZKp3HWwwSKfTTq

总的来说就是,我们平时理解的“1,001.99”,在某些国家,他们是这么显示的“1.001,99”!!!。即他们是用逗号表示小数点。。

问题已明确,那么现在是要确保小数点是句点,不能是逗号。

此处可以考虑使用java.text.DecimalFormatSymbols。

DecimalFormatSymbols otherSymbols = DecimalFormatSymbols.getInstance();
// 指定分割点为句点
otherSymbols.setDecimalSeparator(‘.‘);
df.setDecimalFormatSymbols(otherSymbols);

或者可以考虑指定DecimalFromat的语言环境为具体某个国家,可以参看:http://blog.csdn.net/zhouysh/article/details/265938

这篇文章还讲到了SimpleDateFormat在多语言时候的一个坑,鸣谢作者zhouysh

时间: 2024-08-10 14:59:39

JAVA国际化问题的相关文章

JAVA国际化

大家好,我是成都[LD],今天给大家带来的是JAVA国际化.如果您用过Struts,那您对国际化应该并不陌生. 通常来说,在代码中我们会夹杂一些字符串,这样其实并不好看,维护起来也不是特别方便.举个例子:假设你开发系统是中文版本,突然来了个需求,需要英文版本,如果你将字符串写在代码里面,这样你又不得不将所有的中文字符替换成英文字符.为了减少这种需求下重复劳动,我们通常会自己去写一个配置文件,然后将所有字符串放在配置文件里面,然后去读这个配置文件等等一系列的操作.当然这属于我们自己的一种解决问题的

java 国际化

java  国际化简介 1.Locale类:国际化类,构建具体语言. 2.ResourceBundle:资源文件工具类,读取Locale构造对象的语言文件. 3.MessageFormat:消息格式化类,给资源文件占位符赋值. 4.资源文件命名规范:key_语言代码_国家代码.properties,key可以任意  基本步骤:     1.构造语言Locale对象.         Locale locale = new Locale("zh_CN");     2.读取语言资源文件 

Java国际化知识

在Java中有自动国家化的信息,废话少说看例子.下面是通过Java获取计算机里面的国际化信息. package lee; import java.text.MessageFormat; import java.util.Locale; import java.util.ResourceBundle; public class JavaResource { /** * 打印出来计算机上面可用的国际化资源 */ public static void availableCountry(){ Local

Java国际化(i18n)

Java国际化(i18n) 最近在做一个网站国际化的功能.用Java做开发,使用spring+velocity. Java提供了对i18n的支持,spring对其做了集成,可以很方便的配置.主要思想就是根据语言来读取不同的配置文件,来显示对应的文本.主要步骤如下: 1. 用两个properties文件来保存“符号”到对应语言的映射.如messages_en.properties和messages_zh.properties, 将其放到工程的classPath下 #messages_en.prop

java——国际化详解

深入理解Java国际化 假设我们正在开发一个支持多国语言的Web应用程序,要求系统能够根据客户端的系统的语言类型返回对应的界面:英文的操作系统返回英文界面,而中文的操作系统则返回中文界面--这便是典型的i18n国际化问题.对于有国际化要求的应用系统,我们不能简单地采用硬编码的方式编写用户界面信息.报错信息等内容,而必须为这些需要国际化的信息进行特殊处理.简单来说,就是为每种语言提供一套相应的资源文件,并以规范化命名的方式保存在特定的目录中,由系统自动根据客户端语言选择适合的资源文件. 基础知识

java国际化(转)

1. Java国际化简介 Java既然作为一个跨平台的语言就必然要在各种不同的语言环境中使用, 为了解决这个问题Java给我们提供了一个工具类ResourceBundle, 帮助我们实现Java的国际化, 核心的思想就是, 对不同的语言提供一个不同的资源文件. Java国际化主要通过3个类完成 java.util.ResourceBundle:用于加载一个资源包. java.util.Locale:对应一个特定的国家/区域.语言环境. java.text.MessageFormat:用于将消息格

java国际化(简单说说)

java国际化的思路 一.程序需要支持哪些国家,语言环境-->资源文件中 资源文件是key-value对,key是不变的,但是value是随不同国家,语言而改变 二.主要通过三个类来实现: java.util.ResourceBundle:用于装载特定的国家/区域,语言资源包 java.util.Locale:封装特定国家/区域,语言环境-->国家/区域及其相应代号,语言(相应代号) java.text.MessageFormat:用于格式化带占位符的字符串 1 import java.uti

Java国际化资源文件的选择

(一)在Java环境下有以下资源文件: message_zh_CN.properties message_zh_TW.properties message_zh.properites message.properties 如果Locale为zh_CN,查找资源文件的顺序为: message_zh_CN.properties message_zh.properites message.properties 如果上述三个资源文件都不存在,则抛出异常,不会使用message_zh_TW.propert

java国际化中,查找不同国家的语言代码和对应的语言

package arg.fkjava.structs.actio; import java.util.Locale; public class Test {        public static void main(String[] args) {           Locale[] locals=Locale.getAvailableLocales();           for (Locale locale : locals) {          System.out.printl