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

stjefim
Hello! Suppose you are building workflow (order / task / payment) processing system with the following requirements: Each workflow con...
New
Blokh
Hey guys, I’ve got a huge CSV ( around 10 GB ) that needs to be processed hourly Do you guys have any suggestions what is the best prac...
New
roeland
Kia ora, We have been using elixir-google-api to connect to Google Drive. However, with the updates to Tesla due to CVEs this is now bro...
New
kszambelanczyk
Hello! Could someone please give me a help/sample code, how to delete a file from s3 using waffle/waffle_ecto from Phoenix app. I creat...
New
Onor.io
I have what I’ve heard referred to as a “lookup table” in my database. This is a way of assigning codes to common values. One common lo...
New
jaybe78
Hello, I’m developing a online persistent chat system (what’s app) like using elixir/dynamodb/aws for a mobile app(flutter). The diffic...
New
Trolleger
What approach to take when sending live updates to “random” users Hi! I have a question, I have a little chat app, and when I create a DM...
New

Other Trending Topics Top

garrison
Hobbes is a low-level distributed database for the Elixir programming language. Hobbes provides a simple, safe, and scalable storage lay...
New
mcass19
ExRatatui lets you cook up rich terminal UIs in Elixir, powered by Rust’s ratatui via Rustler NIFs. Build interactive terminal applicatio...
New
Damirados
Hello everyone. After busy few months I am happy to announce v0.1.0 of Emerge &amp; Solve. They are GUI (Emerge) and State management (S...
New
netoum
Corex is an accessible, unstyled UI component library for Phoenix that integrates Zag.js state machines using Vanilla JavaScript and Live...
New
wintermeyer
There are three potential reasons for members of this forum to have a look at https://vutuv.de You are tired or annoyed of LinkedIn. Yo...
New
aseigo
ICal is a library for interacting with iCalendar data. It parses iCalendars into typed Elixir structs via ICal.from_ics, and can prepare ...
New

We're in Beta

About us Mission Statement

Options

Thread Display Mode




Thread Preview

Skip Thread Previews