Quiero eliminar dos caracteres por posición de la cadena, ejemplo de formulario Quiero eliminar caracteres de (subCadenaTX4) en la posición 4 y 5

let fechaNacRFC = "25/12/1997"
let subCadenaTX4 = fechaNacRFC!.replacingOccurrences(of: "/", with: "", options: NSString.CompareOptions.literal, range: nil)
print(subCadenaTX4) // It will be 25121997

Leí que puedo usar removeAtIndex pero, ¿cuál es la forma en este caso?

Mi salida esperada: 251297

2
Jesus Loaiza Herrera 24 jun. 2020 a las 20:39

4 respuestas

La mejor respuesta

Simplemente construiría una nueva cadena usando prefix y suffix o dropFirst:

let subCadenaTX4 = "25121997"

// Desire: drop characters at position 4 and 5
// use prefix to get the first 4 characters
// use suffix to get the last 2 characters
// call String() to covert the result back to String
let result = String(subCadenaTX4.prefix(4) + subCadenaTX4.suffix(2))

o:

// Desire: drop characters at position 4 and 5
// use prefix to get the first 4 characters
// Use dropFirst(6) to pick string starting at position 6
// call String to convert result to String
let result = String(subCadenaTX4.prefix(4) + subCadenaTX4.dropFirst(6))
1
vacawama 24 jun. 2020 a las 18:04

Y aquí hay otra línea única, divida la cadena en "/", luego elimine del principio todo lo que sea más largo que 2 y vuelva a unir

let output = fechaNacRFC.components(separatedBy: "/").map{$0.suffix(2)}.joined()
0
Joakim Danielson 24 jun. 2020 a las 18:18

Puedes usar removeSubrange:

let index1 = subCadenaTX4.index(subCadenaTX4.startIndex, offsetBy: 4)
let index2 = subCadenaTX4.index(index1, offsetBy: 1)
subCadenaTX4.removeSubrange(index1...index2)
print(subCadenaTX4) // prints 251297
0
pawello2222 24 jun. 2020 a las 17:59

Creo que este código se expresa mucho más claramente al hacer que la intención sea más clara, en lugar de burlarse de los índices de cadena.

Esto también le brinda una forma natural de validar que la entrada está en un formato válido.

import Foundation

// You can cache and reuse these 
let parser = DateFormatter()
parser.dateFormat = "dd/MM/yyyy"
let formatter = DateFormatter()
formatter.dateFormat = "ddMMyy"


let input = "25/12/1997"
guard let date = parser.date(from: input) else {
    // TODO: handle error here properly.
    fatalError("The input wasn't in the expected format!")
}
let output = formatter.string(from: date)

print(output) // => 251297

Imagínese si la fuente de la fecha cambió su formato, digamos ISO 8601, alimentando su sistema "1997-12-25". Suponga que implementa su transformación como está tratando de hacerlo, primero reemplazando "/" con "", y luego eliminando los caracteres cuarto y quinto. Su sistema aceptará silenciosamente esta entrada no válida y escupirá en silencio "19972-25", sin indicación de que se haya producido un error.

Con este enfoque, el formato de entrada se valida trivialmente, y captará cosas sin sentido como esta con un fuerte error, en lugar de datos silenciosamente incorrectos.

4
Alexander - Reinstate Monica 24 jun. 2020 a las 18:16