【发布时间】:2017-08-26 03:43:38
【问题描述】:
这里是强制性的“我是编程新手”,但是,我搜索了所有可用的答案并得出结论,我的问题可能与代码更相关,但我可能是错的关于那个。我正在构建一个计算器应用程序,除了显示中的numberFormatter(显示逗号分隔符)外,一切正常。每当我尝试格式化显示器中的数字时,我无法让显示器显示小数点和逗号。
如果我以十进制 .1234 开头,我得到 0.1234,如果我输入 12345,我得到 12,345,但如果我输入 12345.678,我得到 12,345。我正在丢失小数点。我已经测试过它和我的功能来删除无关的“。”似乎不是问题。如果我在标签格式控件之外运行字符串扩展numberFormatter,它似乎可以工作,但我需要防止多个小数和无关的“0”。
我正在向 IBAction 显示代码,其中包含显示标签上显示的按钮display.text,这就是问题所在。此后的所有计算都可以正常工作,使用 replacingOccurrences(of: ",", with: "") 创建一个干净的字符串以转换为 Double 并计算。
我正在使用 sting 扩展来进行格式化。我已经为此工作了好几个星期。有任何想法吗?我是否必须重构将文本输入label.text 的方式?
这里是将文本添加到UILabel display 的代码。
@IBAction func btnTouchDigit(_ sender: UIButton) {
let digit = sender.currentTitle!
if isUserTyping {
var formattedNumber = ""
print( "is user typting + String\(isUserTyping)")
// make sure we aren't adding a second period
var textCurrentlyInDisplay = display.text
textCurrentlyInDisplay = textCurrentlyInDisplay?.replacingOccurrences(of: ",", with: "")
if digit == "." && ((textCurrentlyInDisplay?.range(of: ".")) != nil) {
return
}
else {
formattedNumber = (textCurrentlyInDisplay! + digit)
print("formattedNumber = \(formattedNumber.twoFractionDigits)")
display.text = formattedNumber.twoFractionDigits
// put code here to format label.text to show thousand seperators
print("textCurrentlyInDisplay end = \(textCurrentlyInDisplay!)")
}
}
// make sure we aren't entering a bunch of zero's
else { print("else + \(isUserTyping)")
display.text = digit
if digit == "0" {return}
else if digit == "." {display.text = "0."}
// display.text = (digit == "." ? "0" : "") + digit
isUserTyping = true
}
}
这是我处理 numberFormatter 的字符串转换的扩展。
extension String {
var twoFractionDigits: String {
let styler = NumberFormatter()
styler.minimumFractionDigits = 0
styler.maximumFractionDigits = 16
styler.numberStyle = .decimal
let converter = NumberFormatter()
converter.decimalSeparator = "."
if let result = converter.number(from: self) {
return styler.string(from: result)!
}
return ""
}
【问题讨论】:
-
您的
twoFractionDigits方法没有问题。在"1234.56"上调用它会产生1,234.56的预期结果。所以你的问题在别处。使用调试器,看看输入1234.后会发生什么,然后点击5。 -
我在 btnTouchDigit 函数的末尾放置了一个断点,并用 12345.111 单步执行它,仍然得到 12,345,111。没有错误,没有小数。
标签: ios swift numberformatter