Swift中插值字符串中的数字是否受区域设置的影响?

时间:2016-03-05 11:05:28

标签: swift locale string-interpolation

Swift中的插值字符串是否受区域设置的影响?

所以,例如,如果我有:

let beanCount : Int = 10
let s : String = "I have \(beanCount) beans"

这是否会在每个语言环境中提供以下内容,即使可能会使用非拉丁字母表?

I have 10 beans

对于可以使用小数分隔符的浮点数是否相同?

如果确实发生了变化,但我想要修复它,我怎样才能确保标准格式?

修改

对我的问题稍微澄清一下:

我在这种情况下(虽然我没说清楚)特别注意基本类型,例如整数类型(IntUInt32Int8等。虽然漂浮在哪里也很有趣。

我的用例并非真正用于生成字符串以呈现给用户,而是用于生成应用程序内部使用的字符串,例如文件名,加密密钥,密码或字典键。

在这种情况下,我不希望产生的值受到语言环境的影响,我真的只对基本类型感兴趣。

2 个答案:

答案 0 :(得分:3)

插值使用CustomStringConvertible协议,因此我们可以说这一切都取决于给定类型的实现。

为确保标准格式,请不要依赖description,而NSNumberFormatter主要用于调试目的。

如果要向用户显示字符串,则对于数字,请使用系统或预设区域设置NSDateFormatter。如果您正在处理日期,请使用3000000

你可能认为你不会有整数的格式问题,但如果你有3000000豆怎么办?您当前的实现将打印3 000 000,但您实际需要3.000.0003'000'000def 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中的类型没有。