Swift中的插值字符串是否受区域设置的影响?
所以,例如,如果我有:
let beanCount : Int = 10
let s : String = "I have \(beanCount) beans"
这是否会在每个语言环境中提供以下内容,即使可能会使用非拉丁字母表?
I have 10 beans
对于可以使用小数分隔符的浮点数是否相同?
如果确实发生了变化,但我想要修复它,我怎样才能确保标准格式?
修改
对我的问题稍微澄清一下:
我在这种情况下(虽然我没说清楚)特别注意基本类型,例如整数类型(Int
,UInt32
,Int8
等。虽然漂浮在哪里也很有趣。
我的用例并非真正用于生成字符串以呈现给用户,而是用于生成应用程序内部使用的字符串,例如文件名,加密密钥,密码或字典键。
在这种情况下,我不希望产生的值受到语言环境的影响,我真的只对基本类型感兴趣。
答案 0 :(得分:3)
插值使用CustomStringConvertible
协议,因此我们可以说这一切都取决于给定类型的实现。
为确保标准格式,请不要依赖description
,而NSNumberFormatter
主要用于调试目的。
如果要向用户显示字符串,则对于数字,请使用系统或预设区域设置NSDateFormatter
。如果您正在处理日期,请使用3000000
。
你可能认为你不会有整数的格式问题,但如果你有3000000
豆怎么办?您当前的实现将打印3 000 000
,但您实际需要3.000.000
或3'000'000
或def perm(a, prev=[]):
if not a:
print(prev)
for index, element in enumerate(a):
perm(a[:index] + a[index+1:], prev + [element])
(取决于区域设置)。始终使用数字格式化程序,几乎总是应该使用系统区域设置。
答案 1 :(得分:2)
我知道至少有一种类型的插值取决于语言环境:NSNumber(在Linux上):https://bugs.swift.org/browse/SR-789。该链接是一个名为" NSNumber.description在Linux"上返回本地化版本(例如使用逗号)的问题,并显示NSNumber具有本地化(1000 - >" 1,000")在Linux上插值。
但是,我认为这是一个将要修复的实际错误,因为我对你的问题的回答是字符串插值不是意图受区域设置的影响。
现在,当然是,因为类型通过CustomStringConvertible
协议控制它们的插值,某些类型可以决定以区域敏感的方式进行插值。 / p>
但是Swift标准库和Foundation中的类型没有。