Java 17中如何对Period进行美观易读的格式化?
关于Period格式化为易读年龄字符串的方案
现有工具选择
Java生态内可以直接用Apache Commons Lang3提供的PeriodFormat工具类实现需求,不需要从零开发。它原生支持跳过0值单位、自动处理单复数,也支持自定义配置,实现数值为1时替换为单词one的效果,直接就能输出你给出的示例格式。
自定义实现的规范方案
如果需要自行开发实现,按以下逻辑处理足够规范:
- 第一步:过滤Period的年、月、日三个单位,仅保留数值大于0的项
- 第二步:对每个保留的项做文本转换:数值为1时输出
one + 单数单位(one year/one month/one day),数值大于1时输出数字 + 复数单位 - 第三步:拼接转换后的文本项:仅1项直接输出;2项用
and连接;3项及以上时,前N-1项用,分隔,最后一项前加and
以下是核心实现代码示例:
public static String formatHumanReadablePeriod(Period period) { List<String> validParts = new ArrayList<>(); int years = period.getYears(); if (years > 0) { validParts.add(years == 1 ? "one year" : years + " years"); } int months = period.getMonths(); if (months > 0) { validParts.add(months == 1 ? "one month" : months + " months"); } int days = period.getDays(); if (days > 0) { validParts.add(days == 1 ? "one day" : days + " days"); } if (validParts.isEmpty()) { return "0 days"; } if (validParts.size() == 1) { return validParts.get(0); } if (validParts.size() == 2) { return String.join(" and ", validParts); } return String.join(", ", validParts.subList(0, validParts.size() - 1)) + " and " + validParts.get(validParts.size() - 1); }
关于是否必须使用Format抽象类
没有强制要求必须继承Format抽象类。如果你的项目全量格式化逻辑都基于Format体系做统一抽象,那可以继承该类实现formatToBuffer和parseObject方法保持代码风格一致;如果只是单次业务场景使用,直接写静态工具方法即可,不需要做多余的抽象设计。
内容的提问来源于stack exchange,提问作者Jegors Čemisovs
相关产品推荐
相关产品推荐

