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")

Last Post!

aiwaiwa

aiwaiwa

It must be an iex console limitation! In a regular editor you would’ve seen a visual warning (VSCode here):

But that would need to be a test output to capture such a nuance.

Where Next?

Popular in Questions Top

nobody
Hi! In PHP: $_SERVER[‘SERVER_ADDR’] - in Elixir? Searched the docs for ip address and the web, no good results. Thanks!
New
fireproofsocks
Forgive me if this is obvious, but how does one delete a database record WITHOUT selecting it first? Ecto.Repo — Ecto v3.14.0 has exampl...
New
sergio_101
I am VERY much an elixir newbie. I have taken one elixir course and one phoenix course on Udemy. During that course, I saw the instructor...
New
komlanvi
Hi everyone, I was playing with phoenix liveView but I run into an issue. I have a form and want to validate each input text when the te...
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
SoCreat
i’m a new one to elixir which editor can i use vs code? or atom? Thanks! :smiley:
New
jason.o
In the code below, if the create action is not set to accept “extra_key” as an input, it errors out with a message shown above. Is there ...
New

Other popular topics Top

nobody
Hi! In PHP: $_SERVER[‘SERVER_ADDR’] - in Elixir? Searched the docs for ip address and the web, no good results. Thanks!
New
JakeBecker
TL;DR: I’ve just released an implementation of Microsoft’s IDE-independent Language Server Protocol for Elixir. It adds language support ...
1144 54996 245
New
chrismccord
Phoenix 1.4.0 released Phoenix 1.4 is out! This release ships with exciting new features, most notably with HTTP2 support, improved deve...
688 31525 112
New
gshaw
What is the idiomatic way of matching for not nil in Elixir? E.g., First way: defp halt_if_not_signed_in(conn, signed_in_account) when...
New
sergio_101
I am VERY much an elixir newbie. I have taken one elixir course and one phoenix course on Udemy. During that course, I saw the instructor...
New
bsollish-terakeet
Credo is smart enough to check for (something like) this: assert length(the_list) == 0 with this response: Checking if an enum is empt...
New