在swift中将逗号添加到字符串整数[关闭]
Posted
技术标签:
【中文标题】在swift中将逗号添加到字符串整数[关闭]【英文标题】:add comma to string integers in swift [closed] 【发布时间】:2019-05-25 13:44:02 【问题描述】:好吧,看了一段时间后,我无法找到合适的答案来解决我的问题。
我有包含产品 pricez 数字的字符串。例如 1000、500 或 50。我希望将它们转换为 2 位小数:10.00、5.00 和 0.50
我怎样才能做到这一点,这是否也可以在不将它们转换为 int 或 float 以保留字符串的情况下实现?
【问题讨论】:
这个问题可能需要一些改进:当您似乎想要添加小数点时,标题会显示“添加逗号”;当(考虑到您的回答)您的意思似乎是“返回一个字符串”时,您专门说“不将它们转换为 int 或 floats”。 当您询问“不将它们转换为”数字类型时,实际情况是这正是您应该做的。然后您就可以享受NumberFormatter
的全部力量。本地化结果、小数分隔符、千位/分组分隔符等。虽然这个问题看起来像“只需插入一个.
”,但它比这更复杂,NumberFormatter
是解决所有这些问题的一个很好、简单的解决方案。但它确实需要先将您的字符串转换为数值并除以 100。不要进行笨拙的字符串操作,而是使用适当的工具 NumberFormatter
。
【参考方案1】:
您可以尝试先将价格转换为整数,然后除以 100 - 这样您就有了小数/浮点值。然后使用NSNumberFormatter转回字符串
更新
let formatter = NumberFormatter()
formatter.maximumFractionDigits = 2
formatter.minimumFractionDigits = 2
formatter.minimumIntegerDigits = 1
// formatter.decimalSeparator = "." <- optional step
let double1 = Double(0.5)
let double2 = Double(100.00)
let double3 = Double(50.00555)
print(formatter.string(for: double1))
print(formatter.string(for: double2))
print(formatter.string(for: double3))
// prints
Optional("0.50")
Optional("100.00")
Optional("50.01")
【讨论】:
【参考方案2】:要将其转换为您想要的格式,您需要将数字字符串转换为浮点数,然后除以 100,然后再次返回一个字符串。
以下是我根据您的想法改编的扩展。
var numberString = "20"
extension String
var decimalString: String?
guard let float = Float(self) else return nil
let fraction = float / 100
return String(format: "%.2f", fraction)
// You could unwrap the option either this way...
if let decimalString = numberString.decimalString
print(decimalString)
// or this way...
print(numberString.decimalString ?? "Invalid value")
【讨论】:
【参考方案3】:您必须使用 NumberFormatter 并将您的值除以 100
这里是一个简单的 String 扩展,如果字符串不能转换为 Double 它将返回字符串值:
extension String
var convertToPrice: String?
guard let value = Double(self) else return self
let divided = value / 100
let currencyFormatter = NumberFormatter()
currencyFormatter.numberStyle = .currency
currencyFormatter.currencySymbol = ""
currencyFormatter.decimalSeparator = "."
if let priceString = currencyFormatter.string(for: divided)
return priceString
return self
用法:
"50".convertToPrice // "0.50"
【讨论】:
您对 NSNumber 的看法是对的,我会更新我的答案,谢谢。我硬编码了小数点分隔符,因为在示例中没有货币符号,所以我认为格式总是像“0.50”,如果语言环境设置为他们使用逗号的国家,它会改变所以我对其进行硬编码以适合示例值 我认为假设 OP 想要将分隔符硬编码为.
是一个真正的跳跃,即使这可能会让不同地区的用户感到困惑。这个问题的性质让我认为 OP 甚至没有考虑过语言环境……
如果您将货币符号重置为空字符串,那么将数字格式化程序设置为货币有什么意义?为什么要硬编码小数分隔符?
@rmaddy - FWIW,有一些语言的.decimal
格式与.currency
格式不同。例如。 ml_IN
(马拉雅拉姆语)或en_FI
(英语-芬兰)。此外,如果您想这样做,使用.currency
将按照习惯设置该区域的主要货币的小数位(在日元中,您通常没有任何小数位)。【参考方案4】:
发现这更容易:
func formatPrice(price: String) -> String
let pr = Double(price)!/100
return String(format: "%.2f",pr)
usage: formatPrice("1000") //returning 10.00
【讨论】:
感谢 Andrey Gershengoren 的澄清帮助我编写了这个函数 这也是一个解决方案,但无论如何都应该避免Double(price)!
是的,Joakim,但我返回的 String() 仍然是字符串
为什么要避免安德烈?
@SalihanPamuk 如果你曾经在一个不会转换为双精度的字符串上运行 formatPrice(price:),它会抛出一个异常并且你的应用程序会崩溃。此外,如果您只需要 2 位小数,则不需要 Double。以上是关于在swift中将逗号添加到字符串整数[关闭]的主要内容,如果未能解决你的问题,请参考以下文章
如何在swift中将字符串“One”的字符转换为整数“1”[关闭]