Строка Mutiline из массива

#ios #swift3

#iOS #swift3

Вопрос:

Я должен создать формат строки для создания счетов.У меня есть массив, содержащий словари.Я пытался, но не смог создать строку, подобную этой. Структура массива выглядит следующим образом.

 [["orderid": 139, "productfullqty": 1, "productprice": 8.0, "productname": Falafel, "id": 544, "producthalfqty": , "productonfourthqty": , "productthirdqty": ], ["orderid": 139, "productfullqty":  12, "productprice":  5.4, "productname":  Tomato, "id": 545, "producthalfqty": , "productonfourthqty": , "productthirdqty": ], ["orderid": 139, "productfullqty":  18, "productprice":  180.0, "productname":  Green Sauce, "id": 546, "producthalfqty": , "productonfourthqty": , "productthirdqty": ], ["orderid": 139, "productfullqty":  1, "productprice":  0.46, "productname":  Onions, "id": 547, "producthalfqty": , "productonfourthqty": , "productthirdqty": ], ["orderid": 139, "productfullqty":  1, "productprice":  8.0, "productname":  Falafel, "id": 548, "producthalfqty": , "productonfourthqty": , "productthirdqty": ], ["orderid": 139, "productfullqty":  12, "productprice":  5.4, "productname":  Tomato, "id": 549, "producthalfqty": , "productonfourthqty": , "productthirdqty": ], ["orderid": 139, "productfullqty":  18, "productprice":  180.0, "productname":  Green Sauce, "id": 550, "producthalfqty": , "productonfourthqty": , "productthirdqty": ], ["orderid": 139, "productfullqty":  1, "productprice":  0.46, "productname":  Onions, "id": 551, "producthalfqty": , "productonfourthqty": , "productthirdqty": ]]
  

Используя этот массив, я должен создать строку, подобную этой.
введите описание изображения здесь

Заранее спасибо.

Комментарии:

1. Почему бы не преобразовать эту коллекцию в массив объектов? Это было бы проще в эксплуатации. Как только вы это сделаете, добавьте новую строку с вашими данными и значением формата интервала через цикл for или функцию map, а позже с этим массивом строк вы также можете использовать функцию joined () для коллекций, передав новую строку » n» в качестве разделителя.

2. Не могли бы вы, пожалуйста, пояснить с примером или URL-адресом, спасибо.

3. Вы хотите иметь такое же выравнивание? Потому что это будет работать, только если шрифт, используемый для его последующей печати, является моноширинным. Что вы пробовали?

4. @Larme, спасибо за ответ, нам нужно распечатать счет за заказ клиента на принтере star micronics. И я получил одну демонстрацию от службы поддержки star micronics, в которой указан этот тип формата демонстрационного счета. Итак, мы рассматриваем этот формат для печати счета.

5. В качестве первого шага вам нужно избавиться от массива словарей и создать структуру, которая представляет каждый элемент строки. Это значительно упростит ваш код.

Ответ №1:

Вы могли бы попробовать это.

 let Falafel = "Falafel"
let Tomato = "Tomato"
let GreenSauce = "Green Sauce"
let Onions = "Onions"

let orders = [["orderid": 139, "productfullqty": 1, "productprice": 8.0, "productname": Falafel, "id": 544, "producthalfqty": 1, "productonfourthqty": 1, "productthirdqty": 1], ["orderid": 139, "productfullqty":  12, "productprice":  5.4, "productname":  Tomato, "id": 545, "producthalfqty": 1, "productonfourthqty": 1, "productthirdqty": 1], ["orderid": 139, "productfullqty":  18, "productprice":  180.0, "productname":  GreenSauce, "id": 546, "producthalfqty": 1, "productonfourthqty": 1, "productthirdqty": 1], ["orderid": 139, "productfullqty":  1, "productprice":  0.46, "productname":  Onions, "id": 547, "producthalfqty": 1, "productonfourthqty": 1, "productthirdqty": 1], ["orderid": 139, "productfullqty":  1, "productprice":  8.0, "productname":  Falafel, "id": 548, "producthalfqty": 1, "productonfourthqty": 1, "productthirdqty":1 ], ["orderid": 139, "productfullqty":  12, "productprice":  5.4, "productname":  Tomato, "id": 549, "producthalfqty": 1, "productonfourthqty": 1, "productthirdqty": 1], ["orderid": 139, "productfullqty":  18, "productprice":  180.0, "productname":  GreenSauce, "id": 550, "producthalfqty": 1, "productonfourthqty": 1, "productthirdqty": 1], ["orderid": 139, "productfullqty":  1, "productprice":  0.46, "productname":  Onions, "id": 551, "producthalfqty": 1, "productonfourthqty": 1, "productthirdqty": 1]]

var result = "SKU            Description                        Totaln"
var subTotal: Decimal = 0
orders.forEach { (order) in
    if let sku = order["id"],
        let name = order["productname"],
        let value = order["productprice"],
        let price = value as? NSNumber
    {
        let SKU = "(sku)".cString(using: .utf8)!
        let NAME = "(name)".cString(using: .utf8)!
        let PRICE = String(format:"%0.2f", price.doubleValue).cString(using: .utf8)!
        let string = String(format: "%-15s%-32s%8sn", OpaquePointer(SKU), OpaquePointer(NAME), OpaquePointer(PRICE))
        result.append(string)
        subTotal  = price.decimalValue
    }
}
result.append("Subtotal                                         (subTotal)n")
result.append("Tax                                                 (0.00)n")

print("(result)")
  

Комментарии:

1. Просто исправил вашу структуру данных. Посмотрите: » «producthalfqty»: , «productonfourthqty»:, «productthirdqty»: ] » Вам следует ввести некоторые значения или не добавлять эти ключи

Ответ №2:

 struct MyOrder {
let id: Int
let orderId: Int
let fullQuantity: Int
let halfQuantity: Int
let quarterQuantity: Int
let price: Double
let name: String

init?(dict: [String:Any]) {
    guard let id = dict["id"] as? Int,
        let name = dict["productname"] as? String
    //..
    //..
    // so on
    else { return nil }
    self.id = id
    self.name = name
}
}

let dataArray = [["id":0,"productname":"Oreo"]]
    let orders = dataArray.compactMap { MyOrder(dict: $0) }
    let myStringRows = orders.map{ "($0.id)tt($0.name)tt" } // format your data here.
    let myFinalTable = myStringRows.joined(separator: "n")
    print(myFinalTable)
  

Ответ №3:

Во-первых, убедитесь, что ваш JSON действителен

Во-вторых, вы можете декодировать свой JSON как массив словаря с:

 let order = try? JSONDecoder().decode([[String:Any]], from: #JSONString)