#1 by Inbal
Hi, I am planning to run an experiment in India. I changed the currency unit to INR, but now whenever I use a currency field, there appears a space between the coin symbol and the amount of money (which didn't appear when I used other currencies). Is there a way to remove that space? Also, is there a way to add commas to currency fields when referring to large numbers? I.e., I want the output to look like, e.g., ₹10,000 instead of ₹ 10000. Best, Inbal
#2
by
BonnEconLab
Hi Inbal,
There are multiple ways to manipulate strings via JavaScript. I think it is safer, though, to do the manipulation via Python. In oTree, use vars_for_template for this purpose. It seems that you are using a currency field. You may have to convert this to a “regular” floating-point number first.
For instance, based on the guess_two_thirds example game,
# PAGES
class Introduction(Page):
...
@staticmethod
def vars_for_template(player):
jackpot_float = float(C.JACKPOT)
return dict(
jackpot_formatted = f'₹{jackpot_float:,.2f}',
jackpot_formatted_older_python = '₹{:,.2f}'.format(jackpot_float),
)
See also https://stackoverflow.com/questions/1823058/how-to-print-a-number-using-commas-as-thousands-separators.
Best,
Holger
#3 by Inbal
Hi Holger, Thank you! This is very helpful! I'm curious if there's a way to also permanently remove the space in the currency field for the INR currency unit. I didn't notice any spaces when using other currency units. Best, Inbal
#4
by
BonnEconLab
Shalom Inbal,
I guess that there is a way ... But you have to edit oTree’s core files.
There should be a file .../site-packages/otree/i18n.py (at least there is with the current version, 5.10.3). The path (...) will depend on how exactly you installed oTree (e.g., whether in a virtual environment or not).
In that file, search for “INR”. You will find
if lc == 'en':
if CUR in ['USD', 'CAD', 'AUD']:
return '$#'
if CUR == 'GBP':
return '£#'
if CUR == 'EUR':
return '€#'
if CUR == 'INR':
return '₹ #'
Removing the space between “₹” and “#” should do the job ... But I haven’t tested this.
The space definitely isn’t present on the Indian Rupee banknotes (https://upload.wikimedia.org/wikipedia/commons/b/b8/Banknote_of_india.png).
Cheers,
Holger
#5 by Inbal
Thank you very much, Holger! Best, Inbal
#6
by
BonnEconLab
You’re welcome. A caveat when changing the oTree-wide i18n.py file is that you do not only need to change it locally but also on the server that you will use to run your study.
I have tried to overwrite settings from i18n.py and currency.py by redefining the respective methods in the __init__.py ... but I failed.
To keep your code portable, I would therefore suggest to use a workaround. Based on the number formatting that I suggested earlier, you can, for instance, define a function
def INR(num) -> str:
if num >= 0:
return '₹{:,.2f}'.format(num)
else:
return '−₹{:,.2f}'.format(-num)
This also uses the typographically correct minus symbol (https://unicode-explorer.com/c/2212) instead of the hyphen for negative values.
This allows you to use something like
# PAGES
class Introduction(Page):
...
@staticmethod
def vars_for_template(player):
return dict(
jackpot_INR = INR(C.JACKPOT),
)
#7 by Inbal
Thanks a lot! Best, Inbal