Swift中阿拉伯语字符串格式化:保持短语顺序且数字不分组的实现
解决Swift中阿拉伯语文本与无分组数字的格式化问题
我懂你现在的困扰——既要让阿拉伯语文本和数字保持指定的显示顺序,又要避免数字被自动加上千位分隔符。下面给你两个实用的解决方案:
方案一:单独格式化数字后拼接字符串(最直观可控)
把数字格式化和文本拼接分开处理,完全掌握每一部分的格式细节:
let arabicText = "اللغة" let number = 10000 // 1. 配置数字格式化器,确保输出无千位分隔的纯数字 let numberFormatter = NumberFormatter() numberFormatter.numberStyle = .none // 关闭所有特殊格式,只输出原始数字 numberFormatter.locale = Locale(identifier: "en_US_POSIX") // 避免区域化规则干扰 guard let numberString = numberFormatter.string(from: NSNumber(value: number)) else { // 处理数字格式化失败的异常情况 fatalError("Failed to format number") } // 2. 拼接字符串,用Unicode控制字符强制保持顺序(应对阿拉伯语的RTL排版特性) // \u{200E}是左到右标记(LRM),确保分隔符和数字不会因为RTL规则反转位置 let result = "\(arabicText)\u{200E} - \(numberString)" print(result) // 输出:اللغة - 10000
这里的\u{200E}是关键——它会告诉系统,从这个标记开始的内容按照左到右的顺序渲染,彻底避免阿拉伯语的RTL排版把数字和文本的顺序搞乱。
方案二:自定义Locale配合String(format:)
如果你更习惯用String(format:)的方式,可以自定义一个Locale来禁用数字的千位分隔:
let formatString = "%1$@\u{200E} - %2$d" let arabicText = "اللغة" let number = 10000 // 创建基于POSIX标准的自定义Locale,避免区域化格式影响 var customLocale = Locale(identifier: "en_US_POSIX") // 覆盖数字分组分隔符为空字符串,禁用千位分隔 customLocale.settingDictionary[NumberFormatter.groupingSeparator] = "" // 格式化字符串,同时通过formatString里的LRM控制显示顺序 let result = String(format: formatString, locale: customLocale, arabicText, number) print(result) // 输出:اللغة - 10000
这个方案既保留了String(format:)的便捷性,又通过自定义Locale和Unicode控制字符解决了格式和顺序的问题。
为什么之前的方法不适用?
- 直接用默认
String(format:):虽然控制台输出看起来顺序正确,但在RTL的UI环境中,系统可能会自动反转文本和数字的显示顺序; - 用
en_USLocale:它会默认给数字加上千位分隔符(10,000),不符合你需要纯数字的需求。
内容的提问来源于stack exchange,提问作者Vergiliy
相关产品推荐
相关产品推荐

