博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Android 系列 6.28使用正确的复数格式化
阅读量:4044 次
发布时间:2019-05-24

本文共 1972 字,大约阅读时间需要 6 分钟。

6.28使用正确的复数格式化
问题
你显示的是“找到”+ n +“评论”,但在英语中,“发现1评论”是不合语法。你想要“找到1评论”的情况下n == 1。
对于简单的,仅英语的结果,使用条件语句。为了更好的结果,这可以国际化,使用ChoiceFormat。在Android上,您可以在XML资源文件中使用<plural>。
讨论
“快速和脏”方法是在字符串连接中使用Java的三元运算符(cond?trueval:falseval)。因为在英语中,对于大多数名词,零和复数都用 s 英语附加到名词上(“没有书,一本书,两本书”),我们只需要测试n == 1。
// FormatPlurals.javapublic static void main(String argv[]) {report(0);report(1);report(2);}/** report -- using conditional operator */public static void report(int n) {System.out.println("Found " + n + " item" + (n==1?"":"s"));}
在Java SE上作为主程序运行此程序将显示以下输出:
$ java FormatPluralsFound 0 itemsFound 1 itemFound 2 items$
最后的println()语句是:
if (n==1)System.out.println("Found " + n + " item");elseSystem.out.println("Found " + n + " items");
这更长,所以Java的三元条件运算符值得学习。
当然,你不能任意使用这个,因为英语是一个奇怪的和有些特殊的语言。一些名词,如公共汽车,在末尾需要“es”,而其他的,如现金,是没有复数的集体名词(你可以有两群鹅或两叠现金,但你不能有“两个geeses”或“两个现金”)。一些名词,如鱼,可以被认为是复数,虽然鱼也是正确的复数。
一个更好的方法
java.text中的ChoiceFormat类是处理复数的理想选择;它允许您在名词上指定单数和复数(或更一般地,范围)变体。它能够更多,但在示例6-35中,我将只显示一些更简单的用法。我指定值0,1和2(或更多),以及要打印的字符串值对应于每个数字。然后根据它们落入的范围来格式化数字。
实例6-35。使用ChoiceFormat格式化复数
import java.text.*;/*** Format a plural correctly, using a ChoiceFormat.*/public class FormatPluralsChoice extends FormatPlurals {// ChoiceFormat to just give pluralized wordstatic double[] limits = { 0, 1, 2 };static String[] formats = { "reviews", "review", "reviews"};static ChoiceFormat pluralizedFormat =new ChoiceFormat(limits, formats);// ChoiceFormat to give English text version, quantifiedstatic ChoiceFormat quantizedFormat = new ChoiceFormat("0#no reviews|1#one review|1
这两个循环中的任一个都生成类似于基本版本的输出。使用ChoiceFormat的代码稍长,但更一般,并且更适合国际化。将“量化”形式构造函数的字符串放入strings.xml中,它将是本地化操作的一部分。
最佳方式(仅限Android)
在/res/values/<somefilename>.xml中创建一个包含如下内容的文件:
One item found.
%d items found.
在您的代码中,然后使用以下:
int count = getNumberOfsongsAvailable();Resources res = getResources();String songsFound = res.getQuantityString(R.plurals.numberOfSongsAvailable, count);
我们建议使用XML资源。

转载地址:http://fzrdi.baihongyu.com/

你可能感兴趣的文章
excel 查找一个表的数据在另一个表中是否存在
查看>>
centos 7 上配置dnsmasq 同时支持ipv4和ipv6的DHCP服务
查看>>
AsyncTask、View.post(Runnable)、ViewTreeObserver三种方式总结frame animation自动启动
查看>>
Android中AsyncTask的简单用法
查看>>
解决跨网场景下,CAS重定向无法登录的问题(无需修改现有代码)
查看>>
java反编译命令
查看>>
activemq依赖包获取
查看>>
概念区别
查看>>
final 的作用
查看>>
在Idea中使用Eclipse编译器
查看>>
idea讲web项目部署到tomcat,热部署
查看>>
IDEA Properties中文unicode转码问题
查看>>
Idea下安装Lombok插件
查看>>
zookeeper
查看>>
Idea导入的工程看不到src等代码
查看>>
技术栈
查看>>
Jenkins中shell-script执行报错sh: line 2: npm: command not found
查看>>
8.X版本的node打包时,gulp命令报错 require.extensions.hasownproperty
查看>>
Jenkins 启动命令
查看>>
Maven项目版本继承 – 我必须指定父版本?
查看>>