如何结合NSNumberFormatter与.stringsdict实现带格式的复数化显示?
当然可以轻松结合!
完全没问题,而且这种组合其实是Apple本地化方案里的常规操作——stringsdict负责处理复数规则的本地化,NSNumberFormatter负责数字格式的本地化(比如千位逗号、地区适配的分隔符),两者分工明确,结合起来非常顺畅。
具体实现步骤:
1. 配置你的stringsdict文件
首先按照Apple文档的规范定义复数模板,注意在非单数的模板里用%@占位符(用来接收已经格式化好的带逗号的数字字符串):
<?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd"> <plist version="1.0"> <dict> <key>ThingCountFormat</key> <dict> <key>NSStringLocalizedFormatKey</key> <string>%#@Count@</string> <key>Count</key> <dict> <key>NSStringFormatSpecTypeKey</key> <string>NSStringPluralRuleType</string> <key>NSStringFormatValueTypeKey</key> <string>d</string> <key>one</key> <string>%d thing</string> <!-- 单数用%d直接显示数字,不需要逗号 --> <key>other</key> <string>%@ things</string> <!-- 非单数用%@接收格式化后的数字 --> </dict> </dict> </dict> </plist>
2. 代码中结合两者逻辑
在代码里先使用NSNumberFormatter把数字格式化成带千位分隔的字符串,再传入stringsdict的复数模板中:
func formattedThingCount(_ count: Int) -> String { // 第一步:用NumberFormatter处理数字的本地化格式(千位逗号等) let numberFormatter = NumberFormatter() numberFormatter.numberStyle = .decimal // 自动适配当前地区的数字格式 numberFormatter.locale = Locale.current // 可选:如果需要指定特定地区可以修改这里 guard let formattedNumberStr = numberFormatter.string(from: NSNumber(value: count)) else { return "\(count) things" // 降级处理 } // 第二步:获取stringsdict中的复数模板 let pluralFormat = NSLocalizedString("ThingCountFormat", comment: "Plural format for thing count") // 第三步:根据数量拼接最终结果 if count == 1 { return String(format: pluralFormat, count) } else { return String(format: pluralFormat, formattedNumberStr) } }
3. 为什么这么做?
stringsdict的核心是复数规则的本地化:不同语言的复数规则差异很大(比如俄语有6种复数形式,阿拉伯语更多),它能帮你自动适配这些规则,不用自己写一堆if-else。NSNumberFormatter的核心是数字格式的本地化:它会根据当前地区自动使用正确的千位分隔符(比如美国用逗号,欧洲部分地区用点),还能处理小数、货币等其他格式,比手动拼接逗号靠谱得多。
这样组合之后,你既能得到符合语言习惯的复数表达,又能得到规范的数字格式,完美解决你的需求~
内容的提问来源于stack exchange,提问作者QED
相关产品推荐
相关产品推荐

