Cálculo digito verificador RUT (DNI) Chile / Calculation of verification digit RUT (DNI) Chile

Vi hace un tiempo este post y quise ver si podía optimizar la expresión un poco. Aquí va.

Tomando un campo [RUT] (sea que se digite o no con guión) y calculando el DV correcto sin importar si tiene puntos o no:

SWITCH(
	11-
  MOD(
    NUMBER(MID(RIGHT(CONCATENATE("00", SUBSTITUTE(INDEX(SPLIT(CONCATENATE([RUT]), "-"), 1), ".", "")), 8), 8, 1))*2+
    NUMBER(MID(RIGHT(CONCATENATE("00", SUBSTITUTE(INDEX(SPLIT(CONCATENATE([RUT]), "-"), 1), ".", "")), 8), 7, 1))*3+
    NUMBER(MID(RIGHT(CONCATENATE("00", SUBSTITUTE(INDEX(SPLIT(CONCATENATE([RUT]), "-"), 1), ".", "")), 8), 6, 1))*4+
    NUMBER(MID(RIGHT(CONCATENATE("00", SUBSTITUTE(INDEX(SPLIT(CONCATENATE([RUT]), "-"), 1), ".", "")), 8), 5, 1))*5+
    NUMBER(MID(RIGHT(CONCATENATE("00", SUBSTITUTE(INDEX(SPLIT(CONCATENATE([RUT]), "-"), 1), ".", "")), 8), 4, 1))*6+
    NUMBER(MID(RIGHT(CONCATENATE("00", SUBSTITUTE(INDEX(SPLIT(CONCATENATE([RUT]), "-"), 1), ".", "")), 8), 3, 1))*7+
    NUMBER(MID(RIGHT(CONCATENATE("00", SUBSTITUTE(INDEX(SPLIT(CONCATENATE([RUT]), "-"), 1), ".", "")), 8), 2, 1))*2+
    NUMBER(MID(RIGHT(CONCATENATE("00", SUBSTITUTE(INDEX(SPLIT(CONCATENATE([RUT]), "-"), 1), ".", "")), 8), 1, 1))*3,
    11.0
  ),
  1, "1",
  2, "2",
  3, "3",
  4, "4",
  5, "5",
  6, "6",
  7, "7",
  8, "8",
  9, "9",
  10, "K",
  11, "0",
  "Sin información"
)

En caso de que el campo tenga el RUT completo (con DV) y utilice un Valid_If para ver si se digitó el RUT correctamente:

SWITCH(
	11-
  MOD(
    NUMBER(MID(RIGHT(CONCATENATE("00", SUBSTITUTE(INDEX(SPLIT(CONCATENATE([_THIS]), "-"), 1), ".", "")), 8), 8, 1))*2+
    NUMBER(MID(RIGHT(CONCATENATE("00", SUBSTITUTE(INDEX(SPLIT(CONCATENATE([_THIS]), "-"), 1), ".", "")), 8), 7, 1))*3+
    NUMBER(MID(RIGHT(CONCATENATE("00", SUBSTITUTE(INDEX(SPLIT(CONCATENATE([_THIS]), "-"), 1), ".", "")), 8), 6, 1))*4+
    NUMBER(MID(RIGHT(CONCATENATE("00", SUBSTITUTE(INDEX(SPLIT(CONCATENATE([_THIS]), "-"), 1), ".", "")), 8), 5, 1))*5+
    NUMBER(MID(RIGHT(CONCATENATE("00", SUBSTITUTE(INDEX(SPLIT(CONCATENATE([_THIS]), "-"), 1), ".", "")), 8), 4, 1))*6+
    NUMBER(MID(RIGHT(CONCATENATE("00", SUBSTITUTE(INDEX(SPLIT(CONCATENATE([_THIS]), "-"), 1), ".", "")), 8), 3, 1))*7+
    NUMBER(MID(RIGHT(CONCATENATE("00", SUBSTITUTE(INDEX(SPLIT(CONCATENATE([_THIS]), "-"), 1), ".", "")), 8), 2, 1))*2+
    NUMBER(MID(RIGHT(CONCATENATE("00", SUBSTITUTE(INDEX(SPLIT(CONCATENATE([_THIS]), "-"), 1), ".", "")), 8), 1, 1))*3,
    11.0
  ),
  1, "1"=INDEX(SPLIT(CONCATENATE([_THIS]), "-"), 2),
  2, "2"=INDEX(SPLIT(CONCATENATE([_THIS]), "-"), 2),
  3, "3"=INDEX(SPLIT(CONCATENATE([_THIS]), "-"), 2),
  4, "4"=INDEX(SPLIT(CONCATENATE([_THIS]), "-"), 2),
  5, "5"=INDEX(SPLIT(CONCATENATE([_THIS]), "-"), 2),
  6, "6"=INDEX(SPLIT(CONCATENATE([_THIS]), "-"), 2),
  7, "7"=INDEX(SPLIT(CONCATENATE([_THIS]), "-"), 2),
  8, "8"=INDEX(SPLIT(CONCATENATE([_THIS]), "-"), 2),
  9, "9"=INDEX(SPLIT(CONCATENATE([_THIS]), "-"), 2),
  10, "K"=INDEX(SPLIT(CONCATENATE([_THIS]), "-"), 2),
  11, "0"=INDEX(SPLIT(CONCATENATE([_THIS]), "-"), 2),
  FALSE
)
6 Likes