android 使用String.format("%.2f",67.876)自已定义语言(俄语、西班牙语)会把小数点变为逗号
市场人员反映公司的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)自已定义语言(俄语、西班牙语)会把小数点变为逗号的更多相关文章
- 我的Android进阶之旅------>Java字符串格式化方法String.format()格式化float型时小数点变成逗号问题
今天接到一个波兰的客户说有个APP在英文状态下一切运行正常,但是当系统语言切换到波兰语言的时候,程序奔溃了.好吧,又是我来维护. 好吧,先把系统语言切换到波兰语,切换到波兰语的方法查看文章 我的And ...
- JAVA字符串格式化-String.format()的使用(转)
常规类型的格式化 String类的format()方法用于创建格式化的字符串以及连接多个字符串对象.熟悉C语言的同学应该记得C语言的sprintf()方法,两者有类似之处.format()方法有两种重 ...
- Java字符串格式化String.format常用用法
常规的格式化 String类的format()方法用于创建格式化的字符串以及连接多个字符串对象.熟悉C语言的同学应该记得C语言的sprintf()方法,两者有类似之处.format()方法有两种重载形 ...
- String.format(转)
转自:http://blog.csdn.net/lonely_fireworks/article/details/7962171 方便自己查阅. 常规类型的格式化 String类的format()方法 ...
- JAVA字符串格式化String.format()的使用
JAVA字符串格式化-String.format()的使用常规类型的格式化 String类的format()方法用于创建格式化的字符串以及连接多个字符串对象.熟悉C语言的同学应该记得C语言的sprin ...
- JAVA字符串格式化-String.format()的使用 (转载)
常规类型的格式化 String类的format()方法用于创建格式化的字符串以及连接多个字符串对象.熟悉C语言的同学应该记得C语言的sprintf()方法,两者有类似之处.format()方法有两种重 ...
- 【转】JAVA字符串格式化-String.format()的使用--不错
原文网址:http://blog.csdn.net/lonely_fireworks/article/details/7962171 常规类型的格式化 String类的format()方法用于创建格式 ...
- 【转】JAVA字符串格式化-String.format()的使用
原文网址:http://blog.csdn.net/lonely_fireworks/article/details/7962171 常规类型的格式化 String类的format()方法用于创建格式 ...
- java String.Format详解
JDK1.5中,String类新增了一个很有用的静态方法String.format(): format(Locale l, String format, Object... args) 使用指定的语言 ...
随机推荐
- Ubuntu12.04安装insight-6.8
insight是在Linux下一个比较好用的GDB的前端 insight首页:http://sourceware.org/insight/index.php 在这里下载源码:insight-6.8.t ...
- [转]Delphi 关键字详解
全文链接地址:http://www.cnblogs.com/del/archive/2008/06/23/1228562.html
- cxf客户端代码设置设置访问用户名、密码、证书域名不匹配认证通过
最近和第三方联调,需要调用对方的wsdl,但是调用必须的设置用户名.密码验证.在soapUI里面设置用户名.密码调用通过.但是怎么转换成JAVA代码呢,搜索了好多解决方案,现将代码截图如下: 1.SO ...
- c/c++内存机制(一)(转)
转自:http://www.cnblogs.com/ComputerG/archive/2012/02/01/2334898.html 一:C语言中的内存机制 在C语言中,内存主要分为如下5个存储区: ...
- 将与系统时间格式不同的字符串格式化为DATETIME类型
若系统时间格式为2012/03/05 08:12:12,那么若将("2012-03-05 08:12:12")格式化为时间变量时会报错,在转化之前先将系统时间格式改变再转换就不会报 ...
- IOC-控制反转(Inversion of Control),也成依赖倒置(Dependency Inversion Principle)
基本简介 IoC 亦称为 “依赖倒置原理”("Dependency Inversion Principle").差不多所有框架都使用了“倒置注入(Fowler 2004)技巧,这可 ...
- 关于 wait_event_interruptible() 和 wake_up()的使用
来源:http://blog.csdn.net/allen6268198/article/details/8112551 1. 关于 wait_event_interruptible() 和 wake ...
- Oracle的Net Configuration Assistant 配置
在进行团队开发的时候,一般团队的每一个人只需要安装一个客户端即可,没有必要安装一个Oracle 数据库服务器,而数据库服务器是属于共享的,此时,我们就需要配置客户端.客户端的配置可以有以下两种方式:第 ...
- iOS使用VLC
简 注册登录 添加关注 作者 牵线小丑2016.03.18 10:42 写了4836字,被38人关注,获得了43个喜欢 iOS使用VLC 字数946 阅读698 评论1 喜欢14 简介 库 ...
- Android 判断当前设备是手机还是平板
Android开发需要适配手机和平板,有些需求实现时就要求判断设备是手机还是平板.网上很多说通过设备尺寸.DPI.版本号.是否具备电话功能等进行判断,不过都不算太精确.这里分享一个简洁给力的方法(官方 ...