laiboonh

laiboonh

Having problem comparing Money struct string output

Despite copy and pasting the output, the comparison still return false

iex(2)> Money.to_string! Money.new(:AED, 1234)
"AED 1,234.00"
iex(3)> (Money.to_string! Money.new(:AED, 1234)) == "AED 1,234.00"
false

With more inspection, i can see they are different

ex(5)> (Money.to_string! Money.new(:AED, 1234)) |> IO.inspect(base: :hex)          
<<0x41, 0x45, 0x44, 0xC2, 0xA0, 0x31, 0x2C, 0x32, 0x33, 0x34, 0x2E, 0x30, 0x30>>
"AED 1,234.00"
iex(6)> "AED 1,234.00" |> IO.inspect(base: :hex)                          
<<0x41, 0x45, 0x44, 0x20, 0x31, 0x2C, 0x32, 0x33, 0x34, 0x2E, 0x30, 0x30>>
"AED 1,234.00"

Problem is how can i get Money.to_string output to output “regular” space characters so that comparison passes?
I looked into Cldr.Number — Cldr Numbers v2.31.0 but don’t see anything useful.

Most Liked

kip

kip

ex_cldr Core Team

Most, if not all, currency formats in CLDR use a non-breaking space between the currency and the amount. This is, I think, correct because it would be potentially confusing if a word or line wrap were to occur between the two parts of the string.

If you really want to force a space than you can define your own format like:

# Note this is forcing a breaking space, 0x20
iex> Money.to_string!(Money.new(:AED, 1234), format: "¤ #,###.00")
"AED 1,234.00"
iex> Money.to_string!(Money.new(:AED, 1234), format: "¤ #,###.00") == "AED 1,234.00"
true

However I don’t recommend it for a few reasons:

  1. Not all currencies follow that format. They have variable number of decimal places. Some formats don’t have a space between the currency symbol and the amount.
  2. You’re not going to be local aware (different locales have different formats for the same currency).

In general I don’t think the comparison you’re doing adds a lot of value - although of course I don’t know your use case and I may be missing something. If so, please let me know what you’re trying to achieve and I’ll help.

ex_cldr_number (that does the actually formatting for ex_money) has thousands of tests. If some formatting is incorrect then it’s a bug and I will fix it.

codeanpeace

codeanpeace

If the goal of the test isn’t the formatting of the msg string, but rather that the msg string contains the correct currency and amount, I’d consider using String.contains?/2 in the test instead.

assert String.contains?(msg, "AED")
assert String.contains?(msg, "1,234.00")

Where Next?

Popular in Questions Top

sergio
In Ruby, I can go: User.find_by(email: "foobar@email.com").update(email: "hello@email.com") How can I do something similar in Elixir? ...
New
lessless
I believe there are people here who are dealing with CSV files import on the daily basis, and since Excel is a really popular tool there ...
New
albydarned
Hello all! I am typing this post from my new MacBook Pro with the M1 chip. I’m loving it so far, and will probably use it as my daily dr...
New
Jim
As a follow up to my earlier question: I have the code compiling and running but not getting a successful login from the rest server. ...
New
freewebwithme
Using vs code and installed ElixirLS: support and debugger. And I got an error popped up on start up says Failed to run ‘elixir’ comma...
New
mgjohns61585
Could someone help me? I'm making my first elixir program, number guessing game. I can't figure out how to convert the user's guess from ...
New
aadeshere1
I have a another noob question about loop. Since elixir is immutable, while loop is not directly possible. total = 10 while total != 0 ...
New
fireproofsocks
Forgive me if this is obvious, but how does one delete a database record WITHOUT selecting it first? https://hexdocs.pm/ecto/Ecto.Repo.h...
New
chewm
Hi guys, nice to meet you to the whole forum, I’m new here, I’m trying to configure visual studio code for elixir, right now the intellis...
New
Mooodi
Given a string, how can I get access to its character by index? Enum.at("my_string", 2) doesn't work. Or rather, not char, but a substr...
New

Other popular topics Top

aalberti333
As the title describes, I’m trying to run Enum.map() over a list of key/value pairs, where the value is a map. My data looks like this: ...
New
ycv005
I have followed this StackOverflow post to install the specific version of Erlang. And When I am running mix ecto.setup then getting fol...
New
quazar
How to set Jason to encode all fields in ecto schema, I don’t care about security and implementing only is taking long list of attributes...
New
SoCreat
i’m a new one to elixir which editor can i use vs code? or atom? Thanks! :smiley:
New
fireproofsocks
I’m working on defining a simple Ecto schema for a table (in PostGres), but I don’t see where I can define a column as NOT NULL. Conside...
New
polypush135
As many of you may have realized by now (sorry for all the posts here) I’ve been working on a db problem where I’m trying to aggregate a ...
New
johnnyicon
Hi all, I've just started learning Elixir and Phoenix Framework, so please pardon my n00bness at this stage. I'm trying to use Postg...
New
belgoros
I’m not a pro in using Regex and can’t figure out why the following behaviour happens, especially if we take into account the difference ...
New
josevalim
Hi everyone, One of the features added to Elixir early on to help integration with Erlang code was the idea of overridable function defi...
New
aesmail
Hello guys, I have finally made it. I created an admin interface for a framework. It’s been on my todo list for years and with the curre...
New

We're in Beta

About us Mission Statement