市场人员反映公司的app使用系统设置俄语、西班牙语,double数据会把小数点变为逗号。调试一下,是自定义的语言时候(例如,俄语、西班牙语)转换String.format("%.2f",67.876)。会出现的。

1、android 系统,设置系统语言的步骤

Android【设置】-【语言和输入法】-【语言】列表中找到相应语言所对应的列表项

2、问题分析

java.util.Locale类

在这个Locale类里面,有些语言是没有,例如俄语、西班牙语等。那么这时候android开发时候需要这些语言,怎么办。只好后面自已新建,自定义。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
/**
 * Locale constant for en_CA.
 */
public static final Locale CANADA = new Locale(true, "en", "CA");
 
/**
 * Locale constant for fr_CA.
 */
public static final Locale CANADA_FRENCH = new Locale(true, "fr", "CA");
 
/**
 * Locale constant for zh_CN.
 */
public static final Locale CHINA = new Locale(true, "zh", "CN");
 
/**
 * Locale constant for zh.
 */
public static final Locale CHINESE = new Locale(true, "zh", "");
 
/**
 * Locale constant for en.
 */
public static final Locale ENGLISH = new Locale(true, "en", "");

Locale类里面,私有方法新建语言的。可是不提供外部调用。

1
2
3
4
5
6
7
8
9
10
11
12
/**
     * There's a circular dependency between toLowerCase/toUpperCase and
     * Locale.US. Work around this by avoiding these methods when constructing
     * the built-in locales.
     *
     * @param unused required for this constructor to have a unique signature
     */
    private Locale(boolean unused, String lowerCaseLanguageCode, String upperCaseCountryCode) {
        this.languageCode = lowerCaseLanguageCode;
        this.countryCode = upperCaseCountryCode;
        this.variantCode = "";
    }

源码中的这个方法是共外部新建语言的。
构造一个新的{ @code地区}使用指定的语言,国家,和变体编码。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
/**
 * Constructs a new {@code Locale} using the specified language, country,
 * and variant codes.
 */
public Locale(String language, String country, String variant) {
    if (language == null || country == null || variant == null) {
        throw new NullPointerException();
    }
    if (language.isEmpty() && country.isEmpty()) {
        languageCode = "";
        countryCode = "";
        variantCode = variant;
        return;
    }
 
    languageCode = language.toLowerCase(Locale.US);
    // Map new language codes to the obsolete language
    // codes so the correct resource bundles will be used.
    if (languageCode.equals("he")) {
        languageCode = "iw";
    } else if (languageCode.equals("id")) {
        languageCode = "in";
    } else if (languageCode.equals("yi")) {
        languageCode = "ji";
    }
 
    countryCode = country.toUpperCase(Locale.US);
 
    // Work around for be compatible with RI
    variantCode = variant;
}
 
@Override public Object clone() {
    try {
        return super.clone();
    } catch (CloneNotSupportedException e) {
        throw new AssertionError(e);
    }
}

这是我在外面新建俄语、西班牙语。因为调用不了上面是有方法。只有这个方法。
这个方法的新建是为了匹配资源文件的翻译的以及后面的系统的调用

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
private static final Locale Locale_Russia = new Locale("RUS", "ru", "");
    private static final Locale Locale_Spanish = new Locale("ES", "es", "");
    public static void setApplicationLauguageType(Context context, int type) {
        if (context == null) return;
        Resources resources = context.getResources();//获得res资源对象
        Configuration config = resources.getConfiguration();//获得设置对象
        DisplayMetrics dm = resources .getDisplayMetrics();//获得屏幕参数:主要是分辨率,像素等。
         
        switch (type) {
        case 0:
            config.locale = Locale.getDefault();
            break;
        case 1:
            config.locale = Locale.SIMPLIFIED_CHINESE;
            break;
        case 2:
            config.locale = Locale.ENGLISH;
            break;
        case 3:
            config.locale = Locale_Russia;
            break;
        case 4:
            config.locale = Locale_Spanish;
            break;
        default:
            config.locale = Locale.getDefault();
            break;
        }
         
        resources.updateConfiguration(config, dm);
    }
1
2
3
4
5
/**
     * Returns a localized formatted string, using the supplied format and arguments,
     * using the user's default locale.
     *
     *

If you're formatting a string other than for human * consumption, you should use the {@code format(Locale, String, Object...)} * overload and supply {@code Locale.US}. See * "Be wary of the default locale". * * @param format the format string (see {@link java.util.Formatter#format}) * @param args * the list of arguments passed to the formatter. If there are * more arguments than required by {@code format}, * additional arguments are ignored. * @return the formatted string. * @throws NullPointerException if {@code format == null} * @throws java.util.IllegalFormatException * if the format is invalid. * @since 1.5 */ public static String format(String format, Object... args) { return format(Locale.getDefault(), format, args); }

这上面是一般调用方法,String strResult = String.format("%0.2f",543.6356);
这句语句是double型543.6356保留小数点的两位,并转化成String类型。
调用这个方法时候,其实是默认调用format(Locale.getDefault(), format, args)。因为返回是调用了这个。多了一个参数就是Locale.getDefault()。这个参数使获取系统设置的语言。并作为后面的转换参数的。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
/**
  * Returns a formatted string, using the supplied format and arguments,
  * localized to the given locale.
  *
  * @param locale
  *            the locale to apply; {@code null} value means no localization.
  * @param format the format string (see {@link java.util.Formatter#format})
  * @param args
  *            the list of arguments passed to the formatter. If there are
  *            more arguments than required by {@code format},
  *            additional arguments are ignored.
  * @return the formatted string.
  * @throws NullPointerException if {@code format == null}
  * @throws java.util.IllegalFormatException
  *             if the format is invalid.
  * @since 1.5
  */
 public static String format(Locale locale, String format, Object... args) {
     if (format == null) {
         throw new NullPointerException("format == null");
     }
     int bufferSize = format.length() + (args == null ? 0 : args.length * 10);
     Formatter f = new Formatter(new StringBuilder(bufferSize), locale);
     return f.format(format, args).toString();
 }

那么现在问题就来了。但我使用自定义的语言时候(例如,俄语、西班牙语)。使用下面语句转换,小数点会变成逗号

1
2
double dValue = 360.672;
String strValue = String.format("%.2f",dValue);

结果360,672

如果我使用Locale类有定义,就不会出现这种情况。例如中文,英文肯定是正常的。

3、解决办法

分析到这里了,就说一下解决办法。
只好调用这个方法String.format(Locale.ENGLISH,"%.2f",dValue),多了一个参数。自已传进去转换的语言是什么。不再是默认系统语言设置的。因为对于数据,全世界都是通用,那么默认使用英语来转换都没有问题。数据都是这样转换的。

1
2
double dValue = 360.672;
String strValue = String.format(Locale.ENGLISH,"%.2f",dValue);

那么又产生一个问题,同时有转换字符串。这个得注意一下。

1
String strResult = String.format("%s:%.3f\r\n", getString(R.string.IteInfoCoorType, 654.76);

这个就要分开转换再接起来,不然都是英文,转换不了其他的语言的。

这个设计上缺陷是否是android sdk 或者jdk的存在bug。我使用都是jdk1.7和sdk 4.2版本。
欢迎大家发现与测试。

1
2
String.format("%.2f",dValue);
String.format(Locale.ENGLISH,"%.2f",dValue);

android 使用String.format("%.2f",67.876)自已定义语言(俄语、西班牙语)会把小数点变为逗号的更多相关文章

  1. 我的Android进阶之旅------>Java字符串格式化方法String.format()格式化float型时小数点变成逗号问题

    今天接到一个波兰的客户说有个APP在英文状态下一切运行正常,但是当系统语言切换到波兰语言的时候,程序奔溃了.好吧,又是我来维护. 好吧,先把系统语言切换到波兰语,切换到波兰语的方法查看文章 我的And ...

  2. JAVA字符串格式化-String.format()的使用(转)

    常规类型的格式化 String类的format()方法用于创建格式化的字符串以及连接多个字符串对象.熟悉C语言的同学应该记得C语言的sprintf()方法,两者有类似之处.format()方法有两种重 ...

  3. Java字符串格式化String.format常用用法

    常规的格式化 String类的format()方法用于创建格式化的字符串以及连接多个字符串对象.熟悉C语言的同学应该记得C语言的sprintf()方法,两者有类似之处.format()方法有两种重载形 ...

  4. String.format(转)

    转自:http://blog.csdn.net/lonely_fireworks/article/details/7962171 方便自己查阅. 常规类型的格式化 String类的format()方法 ...

  5. JAVA字符串格式化String.format()的使用

    JAVA字符串格式化-String.format()的使用常规类型的格式化 String类的format()方法用于创建格式化的字符串以及连接多个字符串对象.熟悉C语言的同学应该记得C语言的sprin ...

  6. JAVA字符串格式化-String.format()的使用 (转载)

    常规类型的格式化 String类的format()方法用于创建格式化的字符串以及连接多个字符串对象.熟悉C语言的同学应该记得C语言的sprintf()方法,两者有类似之处.format()方法有两种重 ...

  7. 【转】JAVA字符串格式化-String.format()的使用--不错

    原文网址:http://blog.csdn.net/lonely_fireworks/article/details/7962171 常规类型的格式化 String类的format()方法用于创建格式 ...

  8. 【转】JAVA字符串格式化-String.format()的使用

    原文网址:http://blog.csdn.net/lonely_fireworks/article/details/7962171 常规类型的格式化 String类的format()方法用于创建格式 ...

  9. java String.Format详解

    JDK1.5中,String类新增了一个很有用的静态方法String.format(): format(Locale l, String format, Object... args) 使用指定的语言 ...

随机推荐

  1. statistic学习笔记

    1. 假设检验:就是对于符合一定前提条件的数据,先作一个假设H0,还有一个备择假设H1(一般是H0的反面,或者是H0不包含的情况),通过一定的计算公式,算出一个值(比如开方检验就是开方值),这个值的理 ...

  2. 使用C++11 实现的线程池

    最近打算做一个服务器端程序,每来一个客户端请求新开一个线程进行处理.在网上查了一些资料后,准备使用线程池来做这个东西.使用C++11新的库处理想线程问题比以前简单了许多,在网上找到一份线程池的实现,h ...

  3. C++在使用Qt中SLOT宏需要注意的一个小细节

    大家都知道C++虚函数的机制,对于基类定义为虚函数的地方,子类如果覆写,在基类指针或者引用来指向子类的时候会实现动态绑定. 但如果指针去调用非虚函数,这个时候会调用C++的静态绑定,去判断当前的指针是 ...

  4. window.clearInterval与window.setInterval的用法 定时器的设置

    window.setInterval() 功能:按照指定的周期(以毫秒计)来调用函数或计算表达式. 语法:setInterval(code,millisec) code:在指定时间到时要执行的Java ...

  5. JQuery执行函数与window.onload函数

    JavaScript和HTML之间的交互: 1.通过用户和浏览器操作页面时引发的事件来处理的. 2.当文档或者它的某些元素发生某些变化时,浏览器会自动生成一个事件. 例如:当浏览器装载完一个文档后,会 ...

  6. phalcon安装和输出 hello word

    1:下载和安装Wampserver2.4-x86.exe 服务器: 2:到phalcon官方网站下载对应的dll文件 phalcon_x86_VC9_php5.4.0_1.2.5 我下的是这个版本 所 ...

  7. srpm包的编译方式

    基本说明:后缀仅为rpm的包如xxxxx.rpm称作为二进制包 ------ 可以直接安装到架构匹配的系统上; 后缀为src.rpm的包如webkitgtk-2.4.7-1.fc21.src.rpm称 ...

  8. C# web访问mysql数据库-整理归纳总结

    基本对比 使用方式 使用场合 优缺点 是否需要安装 需要的dll网址 引用方式 程序内引用 程序初期确定使用MySql,前期添加引用 大多数情况下使用在类文件内,多数使用于aspx,ashx等带有后置 ...

  9. C语言到底怎么分配空间

    程序分为:代码区.数据区.bss区.堆区.栈区.平时常用区分的是代码区.堆区.栈区.下面加上例子区分一下. 3 代码区顾名思义就是存放代码的,里面的内容是不可以修改的.例如你定义了一个变量char * ...

  10. Watchcow

    传送门 题目大意: 给你一幅连通的图,要求从起点1开始走,要经过每条边刚好两次,并且最终回到1起点. 思路:将无向图转换成有向图求欧拉回路. #include<cstdio> #defin ...