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