choiceformat_ChoiceFormat:数字范围格式

choiceformat

ChoiceFormat类的Javadoc指出ChoiceFormat “允许您将格式附加到一系列数字上”,并且“通常在MessageFormat中用于处理复数”。 这篇文章描述了java.text.ChoiceFormat并提供了一些在Java代码中应用它的示例。

ChoiceFormat与java.text包中其他“ 格式 ”类之间最明显的区别之一是ChoiceFormat不提供用于访问ChoiceFormat实例的静态方法。 相反, ChoiceFormat提供了两个用于实例化ChoiceFormat对象的构造函数。 用于ChoiceFormat的Javadoc重点说明了这一点:


ChoiceFormat与其他Format类的不同之处在于,您使用构造函数(而不是使用getInstance样式工厂方法)创建ChoiceFormat对象。 不需要工厂方法,因为ChoiceFormat不需要为给定语言环境进行任何复杂的设置。 实际上, ChoiceFormat不会实现任何特定ChoiceFormat语言环境的行为。

用两个数组构造ChoiceFormat

ChoiceFormat提供的两个构造函数中的第一个接受两个数组作为其参数。 第一个数组是原始双精度数组,表示每个间隔的最小值(起始值)。 第二个数组是一个字符串数组,代表与每个时间间隔关联的名称。 这两个数组必须具有相同数量的元素,因为在数字(双)间隔和描述这些间隔的字符串之间存在假定的一对一映射。 如果两个数组的元素数量不同,则会遇到以下异常。


线程“主”中的异常java.lang.IllegalArgumentException:数组和限制数组的长度必须相同。

ChoiceFormat(double [],String [])构造函数的Javadoc说明第一个数组参数名为“ limits”,类型为double[] ,并被描述为“升序限制”。 第二个数组参数名为“ formats”,类型为String[] ,并被描述为“相应的格式字符串”。 根据Javadoc,此构造函数“以限制和相应的格式进行构造”。

下一个代码清单中演示了使用ChoiceFormat构造函数接受两个数组参数的writeGradeInformation(ChoiceFormat)稍后将显示writeGradeInformation(ChoiceFormat)方法和fredsTestScores变量)。

/*** Demonstrate ChoiceFormat instantiated with ChoiceFormat* constructor that accepts an array of double and an array* of String.*/
public void demonstrateChoiceFormatWithDoublesAndStringsArrays()
{final double[] minimumPercentages = {0, 60, 70, 80, 90};final String[] letterGrades = {"F", "D", "C", "B", "A"};final ChoiceFormat gradesFormat = new ChoiceFormat(minimumPercentages, letterGrades);writeGradeInformation(fredsTestScores, gradesFormat);
}

上面的示例满足了图示的ChoiceFormat构造函数的期望。 这两个数组的元素数相同,第一个( double[] )数组的元素按升序排列,第二个( String[] )数组的“格式”与相应的间隔开始限制值相同在第一个数组中。

上面的代码片段中引用的writeGradeInformation(ChoiceFormat)方法演示了如何使用基于两个数组的ChoiceFormat实例来“格式化”作为字符串的提供的数值。 接下来显示该方法的实现。

/*** Write grade information to standard output* using the provided ChoiceFormat instance.** @param testScores Test Scores to be displayed with formatting.* @param gradesFormat ChoiceFormat instance to be used to format output.*/
public void writeGradeInformation(final Collection<Double> testScores,final ChoiceFormat gradesFormat)
{double sum = 0;for (final Double testScore : testScores){sum += testScore;out.println(testScore + " is a '" + gradesFormat.format(testScore) + "'.");}double average = sum / testScores.size();out.println("The average score (" + average + ") is a '"+ gradesFormat.format(average) + "'.");
}

上面的代码使用提供的ChoiceFormat实例来“格式化”测试成绩。 “格式”不是打印数字值,而是打印与数字值所在的时间间隔关联的字符串。 下一个代码清单显示了这些示例中使用的fredsTestScores的定义。

private static List<Double> fredsTestScores;
static
{final ArrayList<Double> scores = new ArrayList<>();scores.add(75.6);scores.add(88.8);scores.add(97.3);scores.add(43.3);fredsTestScores = Collections.unmodifiableList(scores);
}

通过用两个数组实例化的ChoiceFormat实例运行这些测试分数,将产生以下输出:

75.6 is a 'C'.
88.8 is a 'B'.
97.3 is a 'A'.
43.3 is a 'F'.
The average score (76.25) is a 'C'.

使用模式字符串构造ChoiceFormat

接受基于String的模式的ChoiceFormat(String)构造函数可能对那些愿意使用具有类似格式化类的基于String的模式(如DateFormat和DecimalFormat)的开发人员更具吸引力。 下一个代码清单演示了此构造函数的用法。 提供给构造函数的模式会导致ChoiceFormat实例,该实例的格式应与前面示例中使用带有两个数组的构造函数创建的ChoiceFormat实例相同。

/*** Demonstrate ChoiceFormat instantiated with ChoiceFormat* constructor that accepts a String pattern.*/
public void demonstrateChoiceFormatWithStringPattern()
{final String limitFormatPattern = "0#F | 60#D | 70#C | 80#B | 90#A";final ChoiceFormat gradesFormat = new ChoiceFormat(limitFormatPattern);writeGradeInformation(fredsTestScores, gradesFormat);
}

此处调用的writeGradeInformation方法与之前调用的方法相同,并且输出也相同(此处未显示,因为相同)。

极限和边界上的ChoiceFormat行为

到目前为止,这些示例在预期范围内的测试成绩上都运行良好。 现在将使用另一组测试成绩来演示ChoiceFormat其他一些功能。 这组新的测试分数将在下一个代码清单中设置,其中包括“不可能”的否定分数和另一个“可能”高于100的分数。

private static List<Double> boundaryTestScores;
static
{final ArrayList<Double> boundaryScores = new ArrayList<Double>();boundaryScores.add(-25.0);boundaryScores.add(0.0);boundaryScores.add(20.0);boundaryScores.add(60.0);boundaryScores.add(70.0);boundaryScores.add(80.0);boundaryScores.add(90.0);boundaryScores.add(100.0);boundaryScores.add(115.0);boundaryTestScores = boundaryScores;
}

当以上测试分数集通过之前创建的两个ChoiceFormat实例运行时,输出如下所示。

-25.0 is a 'F '.
0.0 is a 'F '.
20.0 is a 'F '.
60.0 is a 'D '.
70.0 is a 'C '.
80.0 is a 'B '.
90.0 is a 'A'.
100.0 is a 'A'.
115.0 is a 'A'.
The average score (56.666666666666664) is a 'F '.

刚刚显示的输出表明ChoiceFormat构造函数中设置的“限制”是“包含的”,这意味着这些限制适用于指定的限制和更高的限制(直到下一个限制)。 换句话说,数字范围被定义为大于或等于指定的限制。 ChoiceFormat的Javadoc文档使用数学描述对此进行了描述:


当且仅当limit [j]≤X <limit [j + 1]时,X与j匹配

边界测试分数示例的输出还演示了Javadoc文档中描述的ChoiceFormat另一个特征:“如果不匹配,则使用第一个或最后一个索引,具体取决于数字(X)太低还是太低”高。” 因为在提供的ChoiceFormat实例中不存在-25.0的匹配项,所以将最低范围(最低限度为“ F”)应用于低于最低范围的那个数字。 在这些测试成绩示例中,没有为“ A”指定比“ 90”更高的限制,因此所有高于90的分数(包括高于100的分数)都针对“ A”。 假设我们想要将分数范围强制在0到100之间,或者对于小于0或大于100的分数,将格式化结果指示为“无效”。这可以如下面的代码清单所示。

/*** Demonstrating enforcing of lower and upper boundaries* with ChoiceFormat instances.*/
public void demonstrateChoiceFormatBoundariesEnforced()
{// Demonstrating boundary enforcement with ChoiceFormat(double[], String[])final double[] minimumPercentages = {Double.NEGATIVE_INFINITY, 0, 60, 70, 80, 90, 100.000001};final String[] letterGrades = {"Invalid - Too Low", "F", "D", "C", "B", "A", "Invalid - Too High"};final ChoiceFormat gradesFormat = new ChoiceFormat(minimumPercentages, letterGrades);writeGradeInformation(boundaryTestScores, gradesFormat);// Demonstrating boundary enforcement with ChoiceFormat(String)final String limitFormatPattern = "-\u221E#Invalid - Too Low | 0#F | 60#D | 70#C | 80#B | 90#A | 100.0<Invalid - Too High";final ChoiceFormat gradesFormat2 = new ChoiceFormat(limitFormatPattern);writeGradeInformation(boundaryTestScores, gradesFormat2);
}

执行上述方法时,其输出显示两种方法都更好地执行了边界条件。

-25.0 is a 'Invalid - Too Low'.
0.0 is a 'F'.
20.0 is a 'F'.
60.0 is a 'D'.
70.0 is a 'C'.
80.0 is a 'B'.
90.0 is a 'A'.
100.0 is a 'A'.
115.0 is a 'Invalid - Too High'.
The average score (56.666666666666664) is a 'F'.
-25.0 is a 'Invalid - Too Low '.
0.0 is a 'F '.
20.0 is a 'F '.
60.0 is a 'D '.
70.0 is a 'C '.
80.0 is a 'B '.
90.0 is a 'A '.
100.0 is a 'A '.
115.0 is a 'Invalid - Too High'.
The average score (56.666666666666664) is a 'F '.

最后一个代码清单演示了如何使用Double.NEGATIVE_INFINITY和\u221E ( Unicode INFINITY字符 )在每个示例中建立最低限度的边界。 对于高于100.0的分数,如果将其格式化为无效分数,则基于数组的ChoiceFormat使用一个稍大于100的数字作为该无效范围的下限。 基于字符串/模式的ChoiceFormat实例在使用小于号(<)来将“无效–过高”范围的下限指定为大于100.0的任何数字时,提供了更大的灵活性和准确性。

使用ChoiceFormat处理无,单数和复数

我通过引用Javadoc来打开这篇文章,指出ChoiceFormat是“通常在MessageFormat中用于处理复数形式”,但尚未在本文中演示这种常用用法。 为了完整起见 ,我将在此处非常简短地演示其中的一部分(没有MessageFormat的复数),但是Java教程的 “ 处理复数”课 ( 国际化的一部分)中提供了ChoiceFormat的这种常用用法的更完整的说明(带有MessageFormat的复数)。 径 )。

下一个代码清单演示了ChoiceFormat在处理单数和复数情况下的应用。

/*** Demonstrate ChoiceFormat used for differentiation of* singular from plural and none.*/
public void demonstratePluralAndSingular()
{final double[] cactiLowerLimits = {0, 1, 2, 3, 4, 10};final String[] cactiRangeDescriptions ={"no cacti", "a cactus", "a couple cacti", "a few cacti", "many cacti", "a plethora of cacti"};final ChoiceFormat cactiFormat = new ChoiceFormat(cactiLowerLimits, cactiRangeDescriptions);for (int cactiCount = 0; cactiCount < 11; cactiCount++){out.println(cactiCount + ": I own " + cactiFormat.format(cactiCount) + ".");}
}

运行最后一个代码清单中的示例将导致输出,如下所示。

0: I own no cacti.
1: I own a cactus.
2: I own a couple cacti.
3: I own a few cacti.
4: I own many cacti.
5: I own many cacti.
6: I own many cacti.
7: I own many cacti.
8: I own many cacti.
9: I own many cacti.
10: I own a plethora of cacti.

ChoiceFormat模式支持的最后一个符号

\u2264 )是ChoiceFormat模式分析可识别的另一种符号,用于根据生成的数值格式化字符串。 在下一个代码清单以及该代码清单之后的代码输出中对此进行了演示。 请注意,在此示例中, \u2264工作原理与使用前面显示的更简单的#号相同。

/*** Demonstrate using \u2264 in String pattern for ChoiceFormat* to represent >= sign. Treated differently than less-than* sign but similarly to #.*/
public void demonstrateLessThanOrEquals()
{final String limitFormatPattern = "0\u2264F | 60\u2264D | 70\u2264C | 80\u2264B | 90\u2264A";final ChoiceFormat gradesFormat = new ChoiceFormat(limitFormatPattern);writeGradeInformation(fredsTestScores, gradesFormat);
}
75.6 is a 'C '.
88.8 is a 'B '.
97.3 is a 'A'.
43.3 is a 'F '.
The average score (76.25) is a 'C '.

评论中的观察

在本节中,我总结了本文及其示例过程中有关ChoiceFormat一些观察。

  • 当使用ChoiceFormat(double [],String [])构造函数时 ,两个传入的数组必须具有相同的大小,否则将引发IllegalArgumentException (“ Array和limit数组必须具有相同的长度。”)。
  • 提供给ChoiceFormat(double [],String [])构造函数的“ limits” double[]数组应具有从左到右以数字升序排列的限制。 如果不是这种情况,则不会引发任何异常,但是逻辑几乎肯定不会正确,因为针对ChoiceFormat实例进行格式化的字符串将错误地“匹配”。 同样的期望也适用于接受模式的构造函数。
  • ChoiceFormat允许Double.POSITIVE_INFINITY和Double.NEGATIVE_INFINITY通过其两个数组的构造函数用于指定范围下限。
  • ChoiceFormat允许\u221E-\u221E通过其单个String(模式)构造函数来指定较低的范围限制。
  • ChoiceFormat构造函数接受String模式比双数组构造函数灵活一些,并且允许将下限边界指定为一定数量范围内的所有内容,而不必确切地包含该特定数量。
  • 提供给单个String ChoiceFormat构造函数的String模式中具有特殊含义的符号和字符包括#<\u2264 ), \u221E )和|

结论

ChoiceFormat允许自定义数字范围的格式,以便特定范围可以具有不同和特定的表示形式。 这篇文章涵盖了使用ChoiceFormat进行数字范围格式化的几个不同方面,但是这篇文章中没有涉及使用ChoiceFormat 从字符串中解析数字范围 。

进一步阅读

  • ChoiceFormat API文档
  • 处理复数
  • 文本:消息格式的自由–第2部分:选择格式
  • 使用ChoiceFormat的Java i18n多元化
  • ChoiceFormat有什么问题? (翻译后的内容–第四部分)
  • 进一步了解ChoiceFormat的问题

翻译自: https://www.javacodegeeks.com/2014/09/choiceformat-numeric-range-formatting.html

choiceformat

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/340069.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

python和rpa_什么是RPA

产品介绍阿里云RPA产品是一款新型工作流程自动化办公机器人软件&#xff0c;通过模拟人工操作进行自动流程执行处理。它可以将办公人员从每日的重复工作中解放出来&#xff0c;提高生产效率。具体而言&#xff0c;阿里云RPA是基于软件机器人和人工智能(AI&#xff0c;Artificia…

php背景图片随页面大小改变,css背景图根据屏幕大小自动缩放

css背景图根据屏幕大小自动缩放代码&#xff1a;html,body{margin:0px;padding:0px;}#background { position: fixed;top: 0;left: 0;width: 100%;height: 100%;overflow: hidden;background-color: #211f1f; display:none\8;}#background .bg-photo {position: absolute;top: …

Java –缺少字体–崩溃的应用程序!

Eclipse MAT和Heaphero都是分析大型堆转储的流行Java工具。 最近&#xff0c;当我们尝试在Eclipse MAT中分析堆转储文件时遇到了一个有趣的问题。 工具因缺少字体crash而崩溃。 我们认为我们将与您分享发现的结果。 CompositeStrike.getStrikeForSlot&#xff08;&#xff09;…

forever不重启 node_运维监控Prometheus,部署安全的node_exporter监控主机

简介prometheus监控系统的时候&#xff0c;是使用pull的方式来获取监控数据&#xff0c;需要被监控端监听对应的端口&#xff0c;prometheus从这些端口服务中拉取对应的数据。node_exporter安全性讨论node_exporter是收集操作系统的指标的一个程序。例如CPU&#xff0c;内存&am…

netbeans ide_IDE:5个最喜欢的NetBeans功能

netbeans ide愉快的发展……。 NetBeans具有许多有趣的功能 &#xff0c;这些功能使开发非常容易&#xff0c;只需很少的步骤&#xff0c;并且可以在非常快速地将产品推向市场的过程中创造出非常高效的环境 。 将我的谈话仅限于五个功能非常困难&#xff0c;而此IDE具有大量有…

python做excel麻烦_高效办公必备:别人通宵做的 Excel,我用Python 半小时搞定!

原标题&#xff1a;高效办公必备&#xff1a;别人通宵做的 Excel,我用Python 半小时搞定&#xff01;最近经常听到周围的人抱怨&#xff1a;“工作忙&#xff0c;在加班……”不知不觉&#xff0c;当代职场人早就被“996”支配得体无完肤了&#xff0c;不仅身体吃尽熬夜加班的苦…

matlab resample,resample matlab实现

使用线性插值实现sample rate转换。function output simpleResample(input, inputfs, outputfs)inputLen length(input(:, 1));outputLen floor(inputLen * outputfs / inputfs);output zeros(outputLen, 1);timeStep inputfs / outputfs;curTime 1;integer 0;frac 0;f…

那是两个小时我不会回来

正如我之前关于linting主题所说的 &#xff0c;花时间修改代码的好处很有限&#xff0c;因为自动工具告诉您这样做。 更糟糕的是&#xff0c;这些工具并非万无一失。 例如&#xff0c;我们一直在针对完美无害的try-with-resources构造周围的SpotBugs警告中添加排除项&#xff…

php助手函数自定义,Laravel 添加自定义助手函数

前言在学习完教程中添加自定义助手函数文件时&#xff0c;还是得记录一下&#xff0c;感觉对composer知道的东西太少了&#xff0c;一些命令到底做了什么还是不知道&#xff0c;总结一下。添加自定义助手函数文件在开发项目的时候&#xff0c;有时候会定义一些函数&#xff0c;…

oracle 查询不同编号的时间最小记录_投稿 | ORACLE amp; PostgreSql 利用伪列删除完全重复的两行...

作者&#xff1a;缪晓丽DBA、数据库爱好者、从业10年。对 DB2、PostgreSQL、Oracle 均有较长的运维经验。本次演示的 test 表如下&#xff1a;01Oracle 的 rowidSQL 语句&#xff1a;DELETE FROM ( SELECT ROW_NUMBER() OVER (PARTITION BY id ORDER BY id) AS rn, id, name…

jpa 实体映射视图_JPA教程:映射实体–第1部分

jpa 实体映射视图在本文中&#xff0c;我将讨论JPA中的实体映射过程。 至于我的示例&#xff0c;我将使用与 我以前的一篇文章中使用的模式相同的模式 。 在前两篇文章中&#xff0c;我解释了如何在Java SE环境中设置JPA。 我不打算为Web应用程序编写设置过程&#xff0c;因为…

php连接函数config,smarty内置函数config_load用法实例

本文实例讲述了smarty内置函数config_load用法。分享给大家供大家参考。具体如下&#xff1a;{config_load}用于从配置文件中&#xff0c;加载到配置变量。详细用法如下&#xff1a;配置文件&#xff1a;foo.conf说明&#xff1a;[Table] 和 [Customer] 表示段落名称。复制代码…

python写前端图形界面_如何Tkinter模块编写Python图形界面

一、为何使用Tkinter而非PyQt众所周知&#xff0c;在Python中创建图形界面程序有很多种的选择&#xff0c;其中PyQt和wxPython都是很热门的模块包&#xff0c;这些第三方的图形界面模块功能强大、配置丰富&#xff0c;界面美观&#xff0c;是很多人的选择。州的先生也经常使用P…

适用于应用程序错误的AWS警报

监视对于任何实际应用都是关键的。 您必须知道正在发生的事情&#xff0c;并在发生问题时实时得到警报。 AWS拥​​有CloudWatch&#xff0c;可以自动为您提供大量指标。 但是&#xff0c;您必须定义一些自己的东西。 然后&#xff0c;您需要定义适当的警报。 在这里&#xff…

addcslashes php,php addcslashes函数怎么用

php addcslashes函数返回在指定字符前添加反斜杠的字符串。其语法是addcslashes(string,characters)&#xff0c;参数string是必须的&#xff0c;规定要转义的字符串&#xff0c;characters是必须&#xff0c;规定要转义的字符或字符范围。addcslashes函数怎么用&#xff1f;作…

struct类型重定义 不同的基类型_C++构造数据类型

结构体(struct)定义&#xff1a;结构体是一个数据类型&#xff0c;是由多个不同类型的数据组成的数据集合。关键字为&#xff1a;struct 。优点&#xff1a;大大减少程序代码的离散性&#xff0c;使程序代码阅读更加符合逻辑。语法&#xff1a;struct 结构体类型名{ 成员类型 成…

卡夫卡队列_卡夫卡编年史队列基准

卡夫卡队列总览 最近&#xff0c;我被要求比较《卡夫卡》和《编年史》的性能。 没有两个产品是完全一样的&#xff0c;要进行公平的比较并不容易。 我们可以尝试运行类似的测试&#xff0c;看看我们得到了什么结果。 该测试基于Apache Kafka性能结果 。 测试使用了什么&#…

php zip怎么安装,php如何安装zip模块?(方法介绍)

php 安装zip模块为php安装zip扩展wget http://pecl.php.net/get/zip-1.13.5.tgz tar -zvxf zip-1.13.5.tgz cd zip-1.13.5 /home/xxx/php/bin/phpize出现错误&#xff1a;Cannot find autoconf. Please check your autoconf installation and the $PHP_AUTOCONF environment va…

vs如何写多线程_java中的多线程的示例

在讨论多线程之前&#xff0c;让我们先讨论线程。线程是进程中轻量级的最小部分&#xff0c;可以与同一进程的其他部分(其他线程)并发运行。线程是独立的&#xff0c;因为它们都有独立的执行路径&#xff0c;这就是为什么如果一个线程中发生异常&#xff0c;它不会影响其他线程…

OCA第4部分中的Java难题

在Java Puzzlers的第四部分中&#xff0c;我们有一些与char类型有关的东西。 public class Puzzler { public static void main(String[] args){ char myChar a ; myChar; System.out.println(myChar); } } 您可能已经猜到了。 它将打印“ b”&#xff0c;其原因是char类型是…