Android 国际货币格式化的一个小知识点

作者: 极小光 | 来源:发表于2017-12-01 11:45 被阅读102次

    简评:今天介绍下 Android 中国际货币格式化的一个小小知识点。

    目前为止,货币格式化最简单的方式是调用NumberFormat.getCurrencyInstance()获得 NumberFormat 实例来把数字格式化为货币格式的字符串(当然也可以把字符串转换成数字)。可以根据当前设备的位置来获取java.util.Currency实例再以此进行货币的格式化。

    但如果我们的应用只接受特定的几种货币,那这种随着用户设备位置而修改货币格式就不是一个好的做法。

    你可能会说「这简单啊,那就在国内默认显示人民币,其他国家就显示美元嘛」。

    嗯,你很有想法。。。

    这里就要讲到这篇文章的重点了。

    假设你给美国地区展示的是 $1,那他们会默认这是 1 美元,这没问题。

    但世界上还有超过二十个国家和地区的本地货币也叫 dollar ($),比如加拿大、澳大利亚和新西兰。这时候如果你还是展示 $1,那这些国家的用户就会默认这是指他们的货币,这就会造成误解,让用户觉得你们的收费不对。

    因此,如果当前用户是在加拿大的,而商品价格需要为美元,那么在进行格式化时还需要明确符号,以表明显示的是美元而不是加元。

    下面是 Kotlin 代码的一个例子:

    class MainActivity : AppCompatActivity() {
    
        override fun onCreate(savedInstanceState: Bundle?) {
            super.onCreate(savedInstanceState)
            setContentView(R.layout.activity_main)
    
            textView1.text = formatCurrency(1f, CURRENCY_US_DOLLARS, LANGUAGE_ENGLISH, COUNTRY_US)
            textView2.text = formatCurrency(1f, CURRENCY_US_DOLLARS, LANGUAGE_ENGLISH, COUNTRY_CANADA)
            textView3.text = formatCurrency(1f, CURRENCY_US_DOLLARS, LANGUAGE_ENGLISH, COUNTRY_AUSTRALIA)
        }
    
        private fun formatCurrency(amount: Float, currency: String, language: String, country: String) =
                currencyInLocale(currency, language, country).format(amount)
    
        private fun currencyInLocale(
                currencyCode: String,
                language: String,
                country: String = "",
                variant: String = ""): NumberFormat =
                Locale(language, country, variant).let {
                    NumberFormat.getCurrencyInstance(it).apply {
                        currency = Currency.getInstance(currencyCode)
                    }
                }
    
        companion object {
            private const val CURRENCY_US_DOLLARS: String = "USD"
            private const val LANGUAGE_ENGLISH: String = "EN"
            private const val COUNTRY_US: String = "US"
            private const val COUNTRY_CANADA: String = "CA"
            private const val COUNTRY_AUSTRALIA: String = "AU"
        }
    }
    
    

    展示效果,从上到下分别是美国、加拿大和澳大利亚:

    这里对于加拿大显示 US$,而澳大利亚显示 USD。虽然两者都能理解,但能符合各语言环境的具体情况当然还是更好的。

    虽然这可能只是一个小知识点,但我个人觉得知道了还是蛮有用的。

    英文原文:Currency Curiosities
    旧文推荐:Android 实现颜色渐变的一个小 tip

    相关文章

      网友评论

      • c4758760dd72:为什么你的头像可以动??
        极小光:@世人小浅 我是在早之前简书允许上传 gif 时上传的,现在不可以了,但上面小伙伴找到了一个办法http://www.jianshu.com/p/1200d92f187d ,你可以试一下,是可行的。但貌似只能在网页端动态,客户端不行来着

      本文标题:Android 国际货币格式化的一个小知识点

      本文链接:https://www.haomeiwen.com/subject/iqyvbxtx.html