android 对字符串单复数显示处理

对于个数,中文在单复数是没有区别的,所以我们平时开发中也不会注意到这个问题,但是别的语言中常常单复数有不同的表示。当App实现国际化功能后字符串的单复数问题越来越明显。以英文为例,在处理个数的时候单复数是不同形的,例如:
中文:1分钟,2分钟,…, n分钟
英文:1 minute,2 minutes,…,n minutes

面对这个问题,最初我想到的解决办法是minute(s),用这个(s)来笼统的代替,但是看起来还是怪别扭的,并且有些特殊的名词的复数形式不是简单加个s。
第二个方法是在代码逻辑里判断

if(英语){
  if(单数){
     ...
  }else{
     ...
  }
}

但是不觉得这种方法实在太蠢了吗,我们难道要在代码中根据不同国家的语言使用if语句来进行各种判断,适配相应的字符串,可想而知这些工作都是极其枯燥。
幸好android系统提供了getQuantityString()为我们解决这类问题,通过getQuantityString()自动选择合适的资源,无需在代码层做选择和使用某种语言和复数规则的复杂判断,只需要在资源文件string.xml中定义好相应的字符串。下面具体介绍其使用方法。
中文的字符串集
res/values/string.xml

<?xml version="1.0" encoding="utf-8"?> 
<resources>
  <plurals name="wastetime">
    <item quantity="other">%d 分钟</item>
  </plurals>
</resources>

英文的字符串集
res/values-en/string.xml

<?xml version="1.0" encoding="utf-8"?> 
<resources>
  <plurals name="wastetime">
    <item quantity="one">%d minute</item>
    <item quantity="other">%d minutes</item>
  </plurals>
</resources>
  • <resources> 是定义资源的所在根。
  • <plurals> 字符串的集合,包含用来修饰不同数量的字符串。它可以包含一个或多个元素。name是资源的名称,name在代码中以reousrce id方式被引用。
  • <item>表示单一或多个 数量的字符串。其中的值可以是其它字符串的引用。
    • 属性:quantity 数量表征的值,由此确定引用哪个字符串。(括号内列出部分语言要求):
描述
zero语言需要对数字0进行特殊处理。(比如阿拉伯语)
one语言需要对类似1的数字进行特殊处理。(比如英语和其它大多数语言里的1;在俄语里,任何以1结尾但不以11结尾的数也属于此类型。)
two语言需要对类似2的数字进行特殊处理。(比如威尔士语)
few语言需要对较小数字进行特殊处理(比如捷克语里的2、3、4;或者波兰语里以2、3、4结尾但不是12、13、14的数。)
many语言需要对较大数字进行特殊处理(比如马耳他语里以11-99结尾的数)
other语言不需要对数字进行特殊处理。

Java代码:

int count = getCount(); 
Resources res = getResources(); 
String songsFound = res.getQuantityString(R.plurals.wastetime, count,count);

注意:在使用getQuantityString()方法时,如果引用的字符串包含%d的字符串格式,需要向方法内传输两次count。在上面例子中,第一次传入的参数count是为plural提供数量quantity作判断的,你第二次传入的count是插入到%d的占位符。

  • 3
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值