Value change in html template from 1200 to 1.2e3

I am fetching “card_income” value from the database (Postgres SQL) has its value as 1200.0 but in the phoenix view template it is showing the value as 1.2e3. What can be the reason? One interesting thing is if I update the value to 1120.0 it shows the same digits as in database that is 1120.0 but why not in case of 1200.0

//My incomecards.html.eex contains the code like
<%= for card <- @cards do %>
$<%= card.card_income %>
<% end %>

These are the same values but with different representation. If you want to display data with “your” format then you need to format it properly. The simples way to achieve that is to use :io_lib.format/2 function:

<%= for card <- @cards do %>
$<%= :io_lib.format("~.2f", [card.card_income]) %>
<% end %>

Alternatively you can use ExCLDR.Numbers library that will allow you to format data with proper locale.

1 Like

Thanks, it works but one issue how to handle if the value is nil giving an error instead of showing blank.

I think there are a couple of things to think about:

  1. It looks like you’re dealing with money. Its not a good idea to use floats to represent money. There are lots of well-known issues. It would be much better to use decimals. There are a few money libraries around that can help.
  2. If indeed you are working with money then I think you should consider nil an invalid value. The balance is 0 or some other value. I think io_lib.format/2 is doing the right thing.
4 Likes

After changing the data type from float to decimal and default value to zero instead of null when I run the website in browser it shows error as shown below in the screenshot. NOTE: If I am not formatting my number using io_lib.format/2 the page shows correct data what I expect but now it is not accepting formating why ?

:io_lib.format/2 works only with basic types, it has no knowledge how to format Elixir structures, especially when you want to format map as a float. However as you store them as decimals then you do not need formatting at all and plain card.card_income should work.

1 Like

I feel summoned… ^.^

Never ever ever ever represent money as floats, never ever ever ever EVER.

There are some good money libraries for elixir that will handle money properly, just never ever ever ever store money as a float.

Now as for this issue, even changing it to decimal is still not ‘quite’ right as you lose information about the value, like what type it is and thus how it should be formatted.

If this is indeed money, use a money library, it will format it properly and all.

1 Like