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

接受基于字符串的模式的ChoiceFormat(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的匹配项,所以将最低范围(最低限度为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 (“数组和限制数组必须具有相同的长度。”)。
  • 提供给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

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

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

相关文章

vue sync用法

1、父组件 <add-rule :show.sync"showEditDialog" :addOrUpdate"addOrUpdate" close"showEditDialog false" :ruleData"editIfo" /> 2、子组件 // 这样可以// this.$emit(close)// 这样也可以this.$emit(update:show, false);…

小程序 获取手机号

【参考小程序开发文档&#xff1a;开发-指南-开放能力-用户信息-获取手机号】 地理位置 wx.getLocation(Object object) | 微信开放文档 手机号 获取手机号 | 微信开放文档 微信信息 小程序与小游戏获取用户信息接口调整&#xff0c;请开发者注意升级。 | 微信开放社区 目录…

Java 生成 32位 UUID

UUID&#xff1a;Universally Unique Identifier 通用唯一识别码 现在很多数据库的主键id&#xff0c;由原来的int自增&#xff0c;改为 UUID 表示。因为 UUID 本身不可能重复&#xff0c;线程安全&#xff0c;完美支持高并发。 示例代码如下&#xff1a; package com.miracle.…

使用Infinispan作为持久性解决方案

从https://vaadin.com/blog/-/blogs/using-infinispan-as-a-persistency-solution交叉发布。 感谢Fredrik和Matti的允许&#xff01; 各种RDBMS是持久性的实际标准。 建筑师认为使用它们是一个安全的选择&#xff0c;我敢说现在它们在很多地方都使用过。 为了解决这个问题&…

CSS布局之脱离文档流详解——浮动、绝对定位脱离文档流的区别

1、代码 &#xff08;1&#xff09;示例代码1 <!DOCTYPE html><html lang"zh"><head><meta charset"UTF-8" /><meta name"viewport" content"widthdevice-width, initial-scale1.0" /><meta http-e…

小程序 获取当前城市位置-高德地图

微信小程序 wx.getLocation 只能获取到经纬度&#xff0c;想要获取具体城市信息&#xff0c;需要使用地图插件。公司要求使用 高德地图&#xff0c;在使用上&#xff0c;几个地图的代码步骤都差不多。 目录 1. 查看官方文档 1.1 申请高德地图Key&#xff0c;点击查看申请key…

会议之于思考

从开始学习英语,我们几乎每天都要开会,讨论问题,确切的说是我们提出疑问,老师在给我们解答.这样高密集的开会,在提高班还是很少见到的 因为老师一个人带了很多学生,还有其他的工作要做.平时可是享受不到这样的待遇的.(其实我们的开会就是上课) 开的会多了,我就想到一个问题.为什…

摇篮善良:仅添加包装用于战争

我的同事Tom Wetjens 在Maven中撰写了博客文章仅打包依赖项 。 当我们想在WAR文件中包含依赖项时&#xff0c;他展示了一种Maven解决方案&#xff0c;而在其他任何作用域中都没有使用。 在这篇博客中&#xff0c;我们将看到我们如何在Gradle中解决这个问题。 假设我们在项目中…

网页端调用企业微信扫一扫 详细过程

效果展示&#xff08;需要使用微信内置浏览器打开&#xff09;&#xff1a; 目录 1. 快速集成H5开发应用 1.1 开始 1.2 创建应用 1.2.1 登录管理后台 1.2.2 添加自建应用 1.2.3 配置应用 1.2.4 获取应用的 AgentID 与 Secret 1.3 配置应用 1.3.1 配置应用主页 1.3.2 配置…

获取ip地址

代码 ///<summary>///取得客户端真实IP。如果有代理则取第一个非内网地址 ///</summary>publicstringIPAddress { get{ stringresult String.Empty; result HttpContext.Current.Request.ServerVariables["HTTP_X_FORWAR…

Oracle DBA 学习总结

对于学习Oracle 数据库&#xff0c;应该先要了解Oracle 的框架。它有物理结构&#xff08;由控制文件、数据文件、重做日志文件、参数文件、归档文件、密码文件组成&#xff09; &#xff0c;逻辑结构&#xff08;表空间、段、区、块&#xff09;&#xff0c;内存分配&#xff…

lodash round

_.round(number, [precision0])根据 precision 四舍五入 number。 _.round(4.006);// > 4_.round(4.006, 2);// > 4.01_.round(4060, -2);// > 4100 更多专业前端知识&#xff0c;请上 【猿2048】www.mk2048.com

可怕的DefaultAbstractHelperImpl

不久前&#xff0c;我们发布了这个有趣的游戏&#xff0c;我们称之为Spring API Bingo 。 当形成有意义的类名时&#xff0c;它是对Spring的巨大创造力的赞美和奉承。 FactoryAdvisorAdapterHandlerLoader ContainerPreTranslatorInfoDisposable BeanFactoryDe​​stination…

微信小程序 监听位置信息

wx.onLocationChange(function callback) | 微信开放文档微信开发者平台文档https://developers.weixin.qq.com/miniprogram/dev/api/location/wx.onLocationChange.html 小程序 获取当前城市位置-高德地图_Start2019-CSDN博客小程序获取位置信息&#xff0c;包括省市区、用户…

通过构建Cocoapods私有库进行组件化开发探索

专题一 一、创建私有索引库 选Github或者码云都可以&#xff0c;本例以Github为例。创建私有索引库用来作为自己组件库的索引&#xff1a; 二、本地添加私有索引库 添加&#xff1a;pod repo add 索引库名称 索引库地址 例&#xff1a;pod repo add ZYHModule https://github.c…

lodash 数组元素查找 findIndex

_.findIndex(array, [predicate_.identity])这个方法类似 _.find。除了它返回最先通过 predicate 判断为真值的元素的 index &#xff0c;而不是元素本身。<!DOCTYPE html><html lang"zh"><head><meta charset"UTF-8" /><meta …

layui 父页面弹框中获取子页面的内容

layer弹层组件开发文档 - Layuihttps://www.layui.site/doc/modules/layer.html#layer.getChildFrame 需求及代码分析 如上图&#xff0c;原来是点击一个按钮跳转到子页面&#xff0c;现在想改为&#xff1a;点击按钮&#xff0c;在当前页打开。因为不想要重写子页面的样式及内…

在JBoss Fuse / Fabric8 / Karaf中使用Byteman

您是否曾经尝试过了解一些非常简单的方法不起作用的过程&#xff1f; 您正在任何众所周知的上下文中编写代码&#xff0c;无论出于何种原因它都无法正常工作。 而且您信任您的平台&#xff0c;因此您认真阅读了所有日志。 而且&#xff0c;您仍然不知道为什么某些行为不符合预…

个人作业——Alpha项目测试

一、 这个作业属于哪个课程 https://edu.cnblogs.com/campus/xnsy/SoftwareEngineeringClass1/ 这个作业要求在哪里 https://edu.cnblogs.com/campus/xnsy/SoftwareEngineeringClass1/homework/3338 团队名称 西柚皇家编程团队&#xff1a;https://www.cnblogs.com/TakeRa…

HttpURLConnection的警告

这段代码对您来说还不错吗&#xff1f; HttpURLConnection connection null; try {connection (HttpURLConnection) url.openConnection();try (InputStream in url.getInputStream()) {return streamToString(in);} } finally {if (connection ! null) connection.disconn…