发布于2026-07-02 阅读(0)
扫一扫,手机访问
在日常开发中,尤其是处理国际化或自然语言解析的场景下,经常需要把像 "FOURTH" 或 "twenty-first" 这样的英文序数词直接转成对应的整数。这个需求听起来简单,但真要用 ICU4J 去实现,不少开发者一上来就会碰壁——原因就出在 API 的设计意图上。
先说几个核心判断:ICU4J 的 RuleBasedNumberFormat 虽然提供了 ORDINAL 模式,但这个模式只负责格式化,也就是把整数转成序数字符串(比如 4 → "4th")。你想反向解析 "FOURTH" 变成 4?这条路走不通。解析功能实际上隐藏在另一个模式里——SPELLOUT。这个模式本来就是用来解析拼写数字的(比如 "four"、"twenty-first"),而且它对标准的英文序数词拼写形式有天然的兼容能力。当然,前提是输入必须是小写。
那么,正确做法到底是什么?大致可以分四步走:
第一,构造格式器时指定 RuleBasedNumberFormat.SPELLOUT;第二,把待解析的字符串统一转成小写,推荐用 String.toLowerCase(Locale.ROOT),这样能避免不同语言环境带来的意外字符映射问题;第三,调用 parse() 方法,记得捕获 ParseException;第四,对返回的 Number 对象用 intValue() 提取结果。
来看一段完整的示例代码,把关键步骤都封装起来了:
import com.ibm.icu.text.RuleBasedNumberFormat;
import com.ibm.icu.text.ParseException;
public class OrdinalParser {
public static int parseOrdinalString(String ordinalStr, Locale locale) throws ParseException {
if (ordinalStr == null || ordinalStr.trim().isEmpty()) {
throw new IllegalArgumentException("Input string cannot be null or empty");
}
RuleBasedNumberFormat formatter = new RuleBasedNumberFormat(locale, RuleBasedNumberFormat.SPELLOUT);
// 必须转小写:SPELLOUT 解析器仅识别小写形式
String normalized = ordinalStr.trim().toLowerCase(Locale.ROOT);
Number result = formatter.parse(normalized);
return result.intValue();
}
public static void main(String[] args) {
try {
System.out.println(parseOrdinalString("FOURTH", Locale.US)); // 输出: 4
System.out.println(parseOrdinalString("twenty-first", Locale.US)); // 输出: 21
System.out.println(parseOrdinalString("ONE HUNDREDTH", Locale.US)); // 输出: 100
} catch (ParseException e) {
System.err.println("Failed to parse ordinal string: " + e.getMessage());
}
}
}
这段代码很简单,但有几个细节值得特别留意:
parse() 严格区分大小写,只认小写形式。像 "FOURTH" 或 "Fourth" 这种,不转小写直接扔进去,解析就会失败。所以每次都要调用 .toLowerCase(Locale.ROOT),这一点不能偷懒。Locale 和字符串的语言是一致的。比如你解析的是英文序数词,那就得用 Locale.US 或 Locale.ENGLISH,用别的那就乱了套了。parse() 遇到无法识别的输入时会抛出 ParseException,这里可不是能随手忽略的地方,得认真处理。RuleBasedNumberFormat 实例。官方说明是线程安全的,但严格来说并非完全无状态。稳妥的做法是每个线程持有自己的实例,或者做好加锁处理。总的来说,RuleBasedNumberFormat.SPELLOUT 是目前 ICU4J 里唯一可靠的、能把英文序数词字符串解析成整数的途径。理解了它的设计初衷——解析拼写数字,而不是格式化序数——再配合标准化的预处理流程,像 "FOURTH" → 4 这样的转换需求就能稳稳地实现了。
售后无忧
立即购买>office旗舰店
售后无忧
立即购买>office旗舰店
售后无忧
立即购买>office旗舰店
售后无忧
立即购买>office旗舰店
正版软件
正版软件
正版软件
正版软件
正版软件
1
2
3
7
8