Expérience de code Vérification d’un IBAN bancaire

Vérification d’un IBAN bancaire

Intéressant de vérifier un IBAN bancaire, les infos pour faire ça https://www.iban.fr/calcul-chiffre-de-controle.html

Bien sûr il y’a des API , sinon en cherchant un peu comment faire une fonction et en  typescript sous angular peut ressembler à ça, en tout cas c’est la solution que j’ai adopté:

    isIBAN(iban: string): boolean {
        const ibanRearranged = iban.substring(4, iban.length) + iban.substring(0, 4);
        const numeric = Array.from(ibanRearranged)
            .map((char) => (isNaN(parseInt(char)) ? (char.charCodeAt(0) - 55).toString() : char))
            .join('');
        const result = Array.from(numeric)
            .map((char) => parseInt(char))
            .reduce((callback, value) => (callback * 10 + value) % 97, 0);
        return result === 1;
    }

Juste pour le fun son équivalent en Elixir en deux versions :

defmodule IBANValidator do
  def is_iban(iban) do
    numeric = String.slice(iban, 4..-1) <> String.slice(iban, 0..3)
    |> String.graphemes()
    |> Enum.map(&convert_char(&1))
    |> Enum.join()
    |> String.graphemes()
    |> Enum.map(&String.to_integer/1)
    |> Enum.reduce(0, fn value, callback -> rem(callback * 10 + value, 97) end)
    numeric == 1
  end

  defp convert_char(char) do
    if String.match?(char, ~r/\d/) do
      char
    else
      char_code = char |> String.to_charlist() |> hd()
      char_code - 55 |> Integer.to_string()
    end
  end
end

iban = "FR7630066100410001057380116"
IO.puts(IBANValidator.is_iban(iban))
defmodule IBANValidator2 do
  def is_iban(iban) do
    normalized_iban = iban
    |> String.replace_prefix("FR", "")
    |> String.reverse()
    |> String.to_charlist()

    case Enum.reduce(normalized_iban, {0, 0}, fn char, {index, acc} ->
      {index + 1, acc + convert_char(char) * :math.pow(10, rem(index, 10))}
    end) do
      {_, result} when rem(result, 97) == 1 -> true
      _ -> false
    end
  end

  defp convert_char(char) do
    if String.match?(char, ~r/\d/) do
      String.to_integer(char)
    else
      String.to_integer(char) - 55
    end
  end
end

iban = "FR7630066100410001057380116"
IO.puts(IBANValidator.is_iban(iban))