#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)