Blog

Sous forme de blog, je vais mettre ici mes expérimentations.

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