这里是强制性的“我是编程新手”,但是,我搜索了所有可用的答案,并得出结论认为我的问题可能是比代码更多的逻辑关系,但我可以对此也是错误的。我正在构建一个计算器应用程序,除了显示屏中的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'。 – rmaddy
我在btnTouchDigit函数的最后放置了一个断点,并用12345.111逐步完成,仍然得到12,345,111。没有错误,也没有小数。 –