How to put values in limit?

I am trying to limit the values so that whenever the program gets a value first it looks at it if its inbound or not. For example, I need the users to input the r, g, and b colors but if it’s greater then 255 then it should take it as 255 and if it’s less then 0 then it should take it as 0.

rgb(r, g, b)

rgb(-23, 345, 222) 

should be 

rgb(0, 255, 222)

I have tried guards and case statements but it doesn’t look good.

Thanks

I’m on a mobile device so untested but something like:

def rgb(r, g, b) do
  r = max(0, r) |> min(255)
  # Same for G and B
end

(Corrected per the comment below)

1 Like

It worked, thanks a lot. It’s a very sleek method of limiting the numbers. Just one modification. You are using pipe operator so there won’t be r as the first argument.

 def rgb(r, g, b) do
    r = max(0, r) |> min(255)
    g = max(0, g) |> min(255)
    b = max(0, b) |> min(255)
  end

If you need to clamp a number n such that 0 <= n < m, you can use rem/2.

clamped = rem(n, m)

If now you need to clamp it with another lower bound, like in l <= n < m you can do it like this:

delta = m - l
clamped = rem(n - delta, m - delta) + delta

For most cases when I was checking, clamped value meant saturating counter, so it would be more like:

def clamp(n, min..max), do: min(min, max(n, max))
4 Likes

Args! Yes, you are totally right… Seems as if I have confused some bits…