数字验证和格式化

时间:2018-04-08 20:54:29

标签: swift swift4

我想实时格式化输入UITextField的数字。根据字段,数字可以是整数或双数,可以是正数或负数。

整数很容易(见下文)。

双打应该完全按照用户输入的方式显示,但有三种可能的例外情况:

  • 如果用户以小数分隔符开头,或者以小数分隔符开头,则插入前导零:
    • “”。变成“0”。
    • “ - ”。变成“-0。”
  • 如果用户删除小数点,则删除所有“多余”前导零:
    • 如果数字为“0.00023”且小数点被删除,则该数字应为“23”。
  • 如果下一个字符不是小数点分隔符,则不允许前导零:
    • “03”变为“3”。

长话短说,只有一个前导零,没有尾随零。

似乎最简单的想法是将(已经过验证的)字符串转换为数字,然后使用格式说明符。我一直在搜索:

https://developer.apple.com/library/content/documentation/Cocoa/Conceptual/Strings/Articles/formatSpecifiers.html

http://www.cplusplus.com/reference/cstdio/printf/

和其他人但是无法弄清楚如何格式化double,以便在它之后没有数字或任何尾随零时不添加小数。例如:

x = 23.0
print (String(format: "%f", x))
//output is 23.000000
//I want 23

x = 23.45
print (String(format: "%f", x))
//output is 23.450000
//I want 23.45

How to create a string with format?上,我找到了这个宝石:

var str = "\(INT_VALUE) , \(FLOAT_VALUE) , \(DOUBLE_VALUE), \(STRING_VALUE)"
print(str)

它完全适用于整数(为什么我说上面的整数很容易),但是对于双精度,它会在用户输入的第一个字符上附加“.0”。 (它在Playground中完美运行,但不是我的程序(为什么??? )。

我是否需要计算小数分隔符之前和之后的位数并将它们插入格式说明符? (如果是这样,我如何计算这些?我知道如何创建格式说明符。)或者是否有一种非常简单的方法或快速修复以使用上面的单行?

谢谢!

1 个答案:

答案 0 :(得分:0)

在没有使用NumberFormatter的情况下变得简单(我不太确定如果没有更多的工作,我真的无法完成我想要的工作)。

let decimalSeparator = NSLocale.current.decimalSeparator! as String

var tempStr: String = textField.text
var i: Int = tempStr.count

//remove leading zeros for positive numbers (integer or real)
if i > 1 {
    while (tempStr[0] == "0" && tempStr[1] != decimalSeparator[0] ) {
        tempStr.remove(at: tempStr.startIndex)
        i = i - 1
        if i < 2 {
            break
        }
    }
}

//remove leading zeros for negative numbers (integer or real)
if i > 2 {
    while (tempStr[0] == "-" && tempStr[1] == "0") && tempStr[2] != decimalSeparator[0]  {
        tempStr.remove(at: tempStr.index(tempStr.startIndex, offsetBy: 1))
        i = i - 1
        if i < 3 {
            break
        }
    }
}

使用以下扩展名下标字符串:

extension String {
    subscript (i: Int) -> Character {
        return self[index(startIndex, offsetBy: i)]
    }
}