laiboonh

laiboonh

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.

Showing Posts 1 to 7

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.

laiboonh

laiboonh OP

Just mainly using this comparison in tests. For example

assert msg = "Final Price: AED 1,234.00"
kip

kip

ex_cldr Core Team

Ok, I thought that was probably it. I think the best way to do that is to capture the output in iex and then, if you consider it to be correct, to copy/paste the emitted value into your tests. That’s exactly how I build most of the tests ex_cldr_numbers and ex_money.

laiboonh

laiboonh OP

I actually did what you suggested before this. It seems like copy and pasting still pasted the output as regular space character. But no worries i can type it out now

kip

kip

ex_cldr Core Team

That’s interesting! Maybe some editors convert non-breaking to breaking space when pasting? I’ll do some searching on that so I can document it for the next person. Please update the thread if you find the cause?

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

— All posts loaded —

Where Next? Top

Trending in Questions Top

katta
I having some trouble figuring out if I have set myself too strict of standards for my production server. Currently I can handle 75% of r...
New
brecabral
Documentation While reading the Scoped Routes section, I noticed that the documentation currently refers to a problem without explainin...
New
achenet
Hello, I’m trying to build a basic Phoenix web-app, and I’d like to use Tailwind. However, when I launch mix phx.server, I get an error...
New
kpanic
Hi everyone, I am toying with the idea of building a “match maker” for giving personal help to people that wants to start coding. I sta...
New
asweet-confluent
I recently noticed that Elixir’s Logger defaults its primary log level to :debug when no :logger, :level application configuration is pre...
New
Cxx-mlr
I’m working on a small exercise involving update_in/3, and I came up with this solution: data = %{ name: "Periodic Table", category:...
New
ChrisAmelia
I’ve got trouble wrapping my head around the order in which functions are called in this snippet (from Phoenix’s authentication): toke...
New

Other Trending Topics Top

GenericJam
Edit: 2026 May 15 - This post is archived. Mob is alive!! Main docs: mob v0.7.11 — Documentation A bit of explanation for the slightly c...
New
JesseHerrick
Hey, I’m Jesse and I’m the main contributor behind Dexter, a full-featured, lightning-fast Elixir LSP optimized for large codebases. It s...
New
mudasobwa
I am happy to introduce the very α version of the new programming language compiled to BEAM. Welcome Cure. It has literally three kille...
New
garrison
Hobbes is a low-level distributed database for the Elixir programming language. Hobbes provides a simple, safe, and scalable storage lay...
New
mhanberg
Hi everyone! The first release candidate for the Expert language server project is now available! We’ve published a press release detai...
New
budgie
A little off-topic, but I feel like people here have a good head on their shoulders. I used to be quite good at making software. Was luc...
New

We're in Beta

About us Mission Statement

Options

Thread Display Mode




Thread Preview

Skip Thread Previews