Expérience de code Vérification d’un IBAN bancaire
/0 Commentaires/dans Blog, code, Typescript /par sysopVé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))