部分Android设备上String.format格式化数字异常?生产环境显示非阿拉伯数字
问题根源:Locale(区域设置)在搞鬼!
你遇到的这个情况不是String.format本身的bug,而是因为String.format()默认会采用设备的**默认Locale(区域设置)**来处理数字格式化——不同地区的Locale对应着不同的数字系统。
举个例子:如果用户的设备Locale设成了阿拉伯语(ar)或者其他使用阿拉伯-Indic数字的区域,%d占位符就会自动把数字转换成该Locale专属的本土数字字符(就是你看到的٠、١这类符号);而你的测试机和自己的电脑用的是中文/英文这类默认用0-9阿拉伯数字的Locale,所以一切正常。
快速解决:强制指定Locale
要让格式化后的数字始终是0-9的标准阿拉伯数字,只需要在调用String.format()时显式指定一个使用标准阿拉伯数字的Locale就行,比如Locale.US或者Locale.ROOT:
int color = 0; int number = 0; // 显式指定Locale,强制输出0-9的阿拉伯数字 String s = String.format(Locale.US, "%dproduct%d", color, number);
如果你需要更精细的数字格式控制,也可以用DecimalFormat来实现,效果是一样的:
import java.text.DecimalFormat; import java.text.DecimalFormatSymbols; import java.util.Locale; // ... int color = 0; int number = 0; DecimalFormatSymbols symbols = DecimalFormatSymbols.getInstance(Locale.US); DecimalFormat df = new DecimalFormat("#", symbols); String s = df.format(color) + "product" + df.format(number);
这样不管用户设备的默认Locale是什么,最终生成的字符串都会是0product0这类符合预期的格式。
内容的提问来源于stack exchange,提问作者Winter is coming
相关产品推荐
相关产品推荐

