【问题标题】:Number validation and formatting数字验证和格式化
【发布时间】:2018-09-18 05:55:27
【问题描述】:

我想实时格式化输入到 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/

和其他人,但不知道如何格式化双精度数,以便在其后没有数字或任何尾随零时不添加小数。例如:

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 中运行良好,但在我的程序中却不行(为什么???)。

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

谢谢!

【问题讨论】:

  • 这就是 NumberFormatter 的用途,另外还有一个好处是可以确保它以对语言环境友好的方式处理数字。
  • 您能详细说明一下吗?我已经弄清楚了一些: func convertDoubleToString(number: Double) -> String { let formatter = NumberFormatter() formatter.numberStyle = .decimal formatter.locale = Locale.current formatter.minimumSignificantDigits = 0 formatter.maximumSignificantDigits = 10 return formatter .string(来自:NSNumber(值:数字))! } myString = 123.45,它有效。 textfield.text = convertDoubleToString(number: myString) 这可行,但如果 myString = 123.,我想要“123.”。
  • 您能帮我格式化 cmets 吗?
  • 您能详细说明一下吗?我已经弄清楚了一些:func convertDoubleToString(number: Double) -> String { let formatter = NumberFormatter() formatter.numberStyle = .decimal formatter.locale = Locale.current formatter.minimumSignificantDigits = 0 formatter.maximumSignificantDigits = 10 return formatter.string(from: NSNumber(value: number))! }myString = 123.45,它有效。 textfield.text = convertDoubleToString(number: myString) 这可行,但如果 myString = 123.,我想要“123.”。
  • 慢慢到那里...如何输入换行符?

标签: swift swift4


【解决方案1】:

结果证明不使用 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)]
    }
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-06-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多