在Swift中从字符串解析多个双打

时间:2019-01-02 21:43:36

标签: ios swift

在Swift中从字符串(在UITextView中输入)解析多个双精度并将其放入双精度数组的最简单/最干净的方法是什么?

比方说,用户输入“ 23.4 45 16.997 -32”。当他进入时,我要

doubleArray[0] = 2
doubleArray[0] = 23
doubleArray[0] = 23.
doubleArray[0] = 23.4
doubleArray[1] = 4
doubleArray[1] = 45

我有

var dataArray = [""]
dataArray = inputString.components(separatedBy: " ")

可以很好地将数据分成字符串数组,然后可以将每个字符串转换为Doubles。但是,有没有一种更简洁的方法?

还有,有没有一种方法可以轻松地实时实时验证进入UITextView的数据?例如,不允许在条目中使用多个小数点或负号,禁止使用字母等?

现在我正在使用

let decimalPoint = NSLocale.current.decimalSeparator! as String
let validChars : Set<Character> = ["0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "-", decimalSeparator[0], " "]  

validChar = Set(inputString).isSubset(of: validChars)
If !validChar {
    inputString.deleteBackward()
    //display Error Message
}

当然,这还需要确保没有小数点或负号...等。所有简单的步骤,但是没有更简单的方法吗? (这也大大简化了-我实际上有特定的错误消息,例如“仅允许使用一个小数点分隔符”,“无效字符”等)。

(在其他情况下,我也玩过NSNumber,但不确定如何/是否可以在这里使用它。)

我觉得我想重新发明轮子...

2 个答案:

答案 0 :(得分:2)

结合利奥和马丁的答案:

let arrayOfDoubles = "This costs US$ 7.99"
  .components(separatedBy:.whitespacesAndNewlines)
  .compactMap{Double($0)}

应该工作并处理多种空白,例如空格,不间断空格,制表符和换行符。

根据Martin R,它将不会处理语言环境的不同数字格式。

您可以将NumberFormatter添加到混合中:

let formatter = NumberFormatter()
formatter.numberStyle = .decimal
formatter.locale = Locale(identifier: "de")

let arrayOfDoubles = "7 3,4 12,2 9 2,3"
    .components(separatedBy:.whitespacesAndNewlines)
    .compactMap{ formatter.number(from: $0).map { $0.doubleValue } }

print(arrayOfDoubles)

(上面的示例用于处理德语格式的数字,并带有逗号十进制分隔符。)

但是,如果您正在处理用于发送/接收到服务器的固定编号格式,则可能没有关系。

答案 1 :(得分:1)

您可以继承modelP2.PlotAreaBorderColor = OxyColors.Transparent; 并重写<asp:Repeater ID="rptArtigos" runat="server"> <HeaderTemplate> <table id="tblArtigos" class="table table-bordered dataTable"> <thead class="thead-dark"> <tr> <th style="width: 20px;">ID</th> <th style="width: 120px">Ref. Cliente</th> <th style="width: 100px">Ref. Interna</th> <th style="width: 100px">Nome</th> <th style="width: 100px">Logística</th> <th style="width: 100px">Estado</th> <th style="width: 10px;">Editar</th> <th style="width: 10px;">Validar</th> <th style="width: 10px;">Rejeitar</th> </tr> </thead> </HeaderTemplate> <ItemTemplate> <tbody> <tr> <td>1</td> <td>REF12345</td> <td>123456</td> <td>User</td> <td>Não Validado</td> <td>Criado</td> <td class="text-center"> <asp:ImageButton ImageUrl="/Images/Buttons/edit.png" CssClass="" Width="25" runat="server" /> </td> <td class="text-center"> <asp:ImageButton ImageUrl="/Images/Buttons/success.png" CssClass="" Width="25" runat="server" /> </td> <td class="text-center"> <asp:ImageButton ImageUrl="/Images/Buttons/x-button.png" CssClass="" Width="25" runat="server" /> </td> </tr> </tbody> </ItemTemplate> <FooterTemplate> </table> </FooterTemplate> </asp:Repeater> 方法,如下所示:

UITextView

textViewDidChange