Re: Binary String pattern matching

Eckard Brauer <[email protected]>
Newsgroups gmane.comp.lang.erlang.general
Message-ID <[email protected]>
Not exactly just matching, but how about first separating integer
characters (and maybe converting them to numbers at the same time)
until a non-integer character appears, then matching:

-module(currtest).
-export([decode_currency/1, decode_currency/2]).

decode_currency(Bin) -> decode_currency(Bin, 0).

decode_currency(<<H,T/binary>>, N)
          when H >= $0, H =< $9 ->
                   decode_currency(T, 10*N+(H-$0));
decode_currency(Bin, N) ->
          case Bin of
                  <<"CHF">> -> {chf, N};
                  <<"EUR">> -> {eur, N};
                  <<"US">> -> {us, N}
          end.

###

<0.81.0> 1> l(currtest), currtest:decode_currency(<<"3123CHF">>).
{chf,3123}
<0.81.0> 2> currtest:decode_currency(<<"341424343EUR">>).
{eur,341424343}


Am Wed, 9 Dec 2020 22:00:03 +0100
schrieb Java House <[email protected]>:

> Hi
> 
> yes the binary string is of the format <<"xxx">>
> 
> <<"3123CHF">>
> > <<"341424343EUR">>
> > <<"14143US">>
> >
>  Thank you for the answer.
> So is there any other way?
> erlang provides the binary_to_list, is there any way to achieve the
> same with a list becasue I tried similare patterns with list and it
> does not work e.g
> [V|T] this will always match the first character of the string to V
> and [V|"CHF"] does not work neither.
> 
> Best
> Nikolas
> 
> Στις Τετ, 9 Δεκ 2020 στις 7:58 μ.μ., ο/η kuna.prime <
> [email protected]> έγραψε:
> 
> > HI,
> >
> > first of all binary string is of form <<"3123CHF">> and not
> > <<3123CHF>> i'm just stating it in case there was a mistake in the
> > first mail
> >
> > to answer your questio in order to pattern match you need to know
> > the size of field you are matching so
> >
> > <<X:4/binary, "CHF">> = <<"3123CHF">>.
> >
> > will match fist 4 bytes and interpret that as new binary (X).
> >
> >
> > Sent with ProtonMail <https://protonmail.com> Secure Email.
> >
> > ‐‐‐‐‐‐‐ Original Message ‐‐‐‐‐‐‐
> > On Wednesday, December 9, 2020 7:28 PM, Java House
> > <[email protected]> wrote:
> >
> > there is a typo in the example
> > currrency_to_credits({cur, << Value , "CHF">>}, Acc)
> >   when Value >= <<"1000">>, Value =< <<"10000">> ->
> >      {chf, Acc + Value };
> > currrency_to_credits({cur, << Value , "EUR">>}, Acc)
> >   when Value >= <<"1000">>, Value =< <<"10000">> ->
> >      {eur, Acc + Value };
> > currrency_to_credits({cur, << Value , "US">>}, Acc)
> >   when Value >= <<"1000">>, Value =< <<"10000">> ->
> >      {us, Acc + Value };
> >
> > Στις Τετ, 9 Δεκ 2020 στις 7:17 μ.μ., ο/η Java House
> > <[email protected]> έγραψε:
> >
> >> Hello all
> >>
> >> I am learning Erlang and have stuck to the following problem.
> >> How to write a function with pattern matching when the parameter
> >> is a binary string.
> >>
> >> I have a list of binary strings e.g.
> >> <<3123CHF>>
> >> <<341424343EUR>>
> >> <<14143US>>
> >>
> >> I am trying to create a function that matches according to a
> >> pattern.
> >>
> >> currrency_to_credits({cur, <<A, "CHF">>}, Acc)
> >>   when Value >= <<"1000">>, Value =< <<"10000">> ->
> >>      {chf, Acc + A};
> >> currrency_to_credits({cur, <<A, "EUR">>}, Acc)
> >>   when Value >= <<"1000">>, Value =< <<"10000">> ->
> >>      {eur, Acc + A};
> >> currrency_to_credits({cur, <<A, "US">>}, Acc)
> >>   when Value >= <<"1000">>, Value =< <<"10000">> ->
> >>      {us, Acc + A};
> >>
> >> But this does not seem to be the right way.
> >> How can I create a pattern for binary string?
> >> will it work better for list string? How?
> >>
> >> Thank you
> >> Nikolas
> >>
> >
> >



-- 
Wir haften nicht für die korrekte Funktion der in dieser eMail
enthaltenen Viren. We are not liable for correct function of the
viruses in this email! :)
lmpx.com only provides a reader for public news (NNTP) servers. It is not affiliated with the servers or forums shown here and is not responsible for the content of articles, which is written by their respective authors.