| | |
Currency format in Bash Script
Thread Solved |
•
•
Join Date: Oct 2007
Posts: 399
Reputation:
Solved Threads: 47
Hey There,
How are you formatting?
locale -a should show you all the locales available, and you could use that to set your environment
LC_ALL=[INSERT_YOUR_PREFERRED_LOCALE_FROM_local-a_ABOVE] locale charmap
should set your formatting correctly.
, Mike
How are you formatting?
locale -a should show you all the locales available, and you could use that to set your environment
LC_ALL=[INSERT_YOUR_PREFERRED_LOCALE_FROM_local-a_ABOVE] locale charmap
should set your formatting correctly.
, Mike
Linux and Unix Tips, Tricks and Individual Advice - The Linux and Unix Menagerie!
------------------------------------------------------------------------
The greatest viral marketing idea of all time, get your copy of this Free Report now!
------------------------------------------------------------------------
The greatest viral marketing idea of all time, get your copy of this Free Report now!
•
•
Join Date: Oct 2007
Posts: 399
Reputation:
Solved Threads: 47
Hey again,
To my knowledge there's no currency routine or built-in in the bash shell, but you could write a function to take care of it.
Also, if this helps, check out this manpage for "units" - it deals mostly with conversion of things like yards and feet, but has some interesting stuff in the middle regarding currency. It might be a good place to start.
Let me know how you come along. If you want, post again with (as specific as possible, what you want to do (like how the currency should format, etc). I'd be interested in helping you out for selfish reasons as well. I'm not sure how to do it and it would make for a good exercise
Best wishes,
Mike
To my knowledge there's no currency routine or built-in in the bash shell, but you could write a function to take care of it.
Also, if this helps, check out this manpage for "units" - it deals mostly with conversion of things like yards and feet, but has some interesting stuff in the middle regarding currency. It might be a good place to start.
Let me know how you come along. If you want, post again with (as specific as possible, what you want to do (like how the currency should format, etc). I'd be interested in helping you out for selfish reasons as well. I'm not sure how to do it and it would make for a good exercise

Best wishes,
Mike
Linux and Unix Tips, Tricks and Individual Advice - The Linux and Unix Menagerie!
------------------------------------------------------------------------
The greatest viral marketing idea of all time, get your copy of this Free Report now!
------------------------------------------------------------------------
The greatest viral marketing idea of all time, get your copy of this Free Report now!
•
•
Join Date: Apr 2008
Posts: 58
Reputation:
Solved Threads: 9
Try the following out:
I just wrote this ugly piece of code up - and it should do exactly what you are looking for - unless of course you need to parse cents - in which case its going to need some extra work.
Shell Scripting Syntax (Toggle Plain Text)
function formatCurr { dollar_amt=$1 length=`echo $dollar_amt | awk '{ print length($0) }'` mod=`expr $length % 3` div3=`expr $length / 3` if [[ $mod -ne 0 ]] then dollar_pt0=`echo $dollar_amt | cut -c 1-$mod` fi dollar_fin=`echo "${dollar_pt0}"` modp1=`expr $mod + 1` incr=`expr $mod + 3` for (( i = 0; i < $div3; i++ )) do mySub=`echo $dollar_amt | cut -c ${modp1}-${incr}` if [[ $modp1 -ne 1 ]] then dollar_fin=`echo ${dollar_fin},${mySub}` else dollar_fin=`echo ${dollar_fin}${mySub}` fi incr=`expr $incr + 3` modp1=`expr $modp1 + 3` done dollar_fin=`echo "$"$dollar_fin` echo $dollar_fin }
•
•
Join Date: Apr 2008
Posts: 58
Reputation:
Solved Threads: 9
A final script that parses cents, if input using a dot ("."):
This script is based on the idea that the first comma has to come after (numberLength) mod 3 digits... E.g., if the digit is 9 characters, 9 % 3 = 0. In the event of 0, the first comma is skipped. 10 % 3 = 1, so after the 1st character, we place a comma. Subsequently, we place a comma after every 3rd character. (numberLength) / 3 = the number of commas that need to be placed, so for 0 to (numberLength) / 3 we grab three characters starting at the last position we left off at and then insert a comma.
It parses cents by looking for the ".". If it exists, it assigns the cent amount, and the dollar amount. We check and make sure cents are no more than 2 digits. We then assign a period to the beginning of the cents - I did this because otherwise at the bottom when you combine dollars with cents you would have to determine whether or not cents has been defined - this just makes one less logic to look for.
At the end you echo a dollar sign with dollars and cents trailing - this is the return for the function, so you can assign it as such:
dollar_format=`formatCurr(rawAmount)`
Let me know if you find an error.
c Syntax (Toggle Plain Text)
function formatCurr { dollar_amt=$1 cents=`echo $dollar_amt | grep '\.'` if [[ "x${cents}x" != "xx" ]] then cent_amt=`echo $dollar_amt | cut -d"." -f2 | cut -c 1-2` dollar_amt=`echo $dollar_amt | cut -d"." -f1` cent_amt=`echo ".$cent_amt"` fi length=`echo $dollar_amt | awk '{ print length($0) }'` mod=`expr $length % 3` div3=`expr $length / 3` if [[ $mod -ne 0 ]] then dollar_fin=`echo $dollar_amt | cut -c 1-$mod` fi modp1=`expr $mod + 1` incr=`expr $mod + 3` for (( i = 0; i < $div3; i++ )) do mySub=`echo $dollar_amt | cut -c ${modp1}-${incr}` if [[ $modp1 -ne 1 ]] then dollar_fin=`echo ${dollar_fin},${mySub}` else dollar_fin=`echo ${dollar_fin}${mySub}` fi incr=`expr $incr + 3` modp1=`expr $modp1 + 3` done if [[ "x${cent_amt}x" != "xx" ]] then dollar_fin=`echo ${dollar_fin}${cent_amt}` fi echo "$"$dollar_fin }
It parses cents by looking for the ".". If it exists, it assigns the cent amount, and the dollar amount. We check and make sure cents are no more than 2 digits. We then assign a period to the beginning of the cents - I did this because otherwise at the bottom when you combine dollars with cents you would have to determine whether or not cents has been defined - this just makes one less logic to look for.
At the end you echo a dollar sign with dollars and cents trailing - this is the return for the function, so you can assign it as such:
dollar_format=`formatCurr(rawAmount)`
Let me know if you find an error.
Last edited by omrsafetyo; Jun 19th, 2008 at 9:30 pm.
•
•
Join Date: Oct 2007
Posts: 399
Reputation:
Solved Threads: 47
Rock and roll,
That's awesome that you've got two workable options now!!
And, thanks to omrsafetyo, from myself. Nice work. Hasn't produced an error yet
Glad to help out
, Mike
That's awesome that you've got two workable options now!!
And, thanks to omrsafetyo, from myself. Nice work. Hasn't produced an error yet

Glad to help out

, Mike
Linux and Unix Tips, Tricks and Individual Advice - The Linux and Unix Menagerie!
------------------------------------------------------------------------
The greatest viral marketing idea of all time, get your copy of this Free Report now!
------------------------------------------------------------------------
The greatest viral marketing idea of all time, get your copy of this Free Report now!
•
•
Join Date: Nov 2008
Posts: 1
Reputation:
Solved Threads: 0
Hi ormsafetyo,
I'am just starting with shells and i'am having problems with my first one.
I need to write a shell script that receives 3 parameters (Filename, Item Description, and Amount)
when the script is invoked, it is suppossed to insert the "Item Description" and "Amount" to the the exsisting text file, I guess is working fine, but I need to format the number from this 12530 to this 12,530 or from this 1225550 to this 1,225,550
I'am trying to use your function formatCurr but I guess I don't know how to use it in the correct way or even how to call the function
I will really appreciate if you can help me with this!!!!!!!
THIS IS THE ERROR I GET WHEN RUNNING THE SCRIPT:
----------------------------------------------------------------------
B0581342 >prueba.sh 'adrian.txt' 'item description' '12530'
UX:sh (prueba.sh): ERROR: prueba.sh: Syntax error at line 1: `formatCurr' unexpected
B0581342 >more adrian.txt
item description 12530
B0581342 >
THE FOLLOWING IS THE SCRIPT:
--------------------------------------------
I'am just starting with shells and i'am having problems with my first one.
I need to write a shell script that receives 3 parameters (Filename, Item Description, and Amount)
when the script is invoked, it is suppossed to insert the "Item Description" and "Amount" to the the exsisting text file, I guess is working fine, but I need to format the number from this 12530 to this 12,530 or from this 1225550 to this 1,225,550
I'am trying to use your function formatCurr but I guess I don't know how to use it in the correct way or even how to call the function
I will really appreciate if you can help me with this!!!!!!!
THIS IS THE ERROR I GET WHEN RUNNING THE SCRIPT:
----------------------------------------------------------------------
B0581342 >prueba.sh 'adrian.txt' 'item description' '12530'
UX:sh (prueba.sh): ERROR: prueba.sh: Syntax error at line 1: `formatCurr' unexpected
B0581342 >more adrian.txt
item description 12530
B0581342 >
THE FOLLOWING IS THE SCRIPT:
--------------------------------------------
bash Syntax (Toggle Plain Text)
#!/bin/sh ################################################################ LOCALDIR=/usrclass/soa/ cd /usrclass/soa/ cd $LOCALDIR FAXFILE=$1 DESRUBRO=$2 MONRUBRO=$3 RUBRO=$2 MONTO=$3 if [ ! -f "$FAXFILE" ]; then touch "$FAXFILE" # cria o arquivo de LOG se ele nM-co existe else if [ `ls -al $FAXFILE | awk '{print $5}'` -gt 5000000 ]; then mv $FAXFILE `ls $FAXFILE | cut -f1 -d .`".old" touch "$FAXFILE" fi fi CONT_RUBRO=40 CONT_MONTO=15 ESPACIOS_RUBRO=" " ESPACIOS_MONTO=" " LINEA_RUBRO=" " lenrubro=`echo $DESRUBRO | wc -c` lenrubro=`expr $lenrubro - 1` lenmonto=`echo $MONRUBRO | wc -c` lenmonto=`expr $lenmonto - 1` if [ $lenrubro -lt $CONT_RUBRO ]; then while [ $lenrubro -lt $CONT_RUBRO ] do ESPACIOS_RUBRO="$ESPACIOS_RUBRO"" " lenrubro=`expr $lenrubro + 1` done RUBRO=$RUBRO$ESPACIOS_RUBRO fi if [ $lenmonto -lt $CONT_MONTO ]; then while [ $lenmonto -lt $CONT_MONTO ] do ESPACIOS_MONTO="$ESPACIOS_MONTO"" " lenmonto=`expr $lenmonto + 1` done MONTO=$ESPACIOS_MONTO$MONTO fi LINEA_RUBRO=$RUBRO$MONTO echo "$LINEA_RUBRO" >> $FAXFILE #**************************************************** #THESE ARE THE TWO LINES I ADDED TO TRY TO USE THE FUNCTION #I ALSO TRY TO USE THESE TWO LINES AT THE END dollar_format=`formatCurr("$MONRUBRO")` echo "$dollar_format" >> $FAXFILE #******************************************************** #******************************************************* function formatCurr { dollar_amt=$3 cents=`echo $dollar_amt | grep '\.'` if [[ "x${cents}x" != "xx" ]] then cent_amt=`echo $dollar_amt | cut -d"." -f2 | cut -c 1-2` dollar_amt=`echo $dollar_amt | cut -d"." -f1` cent_amt=`echo ".$cent_amt"` fi length=`echo $dollar_amt | awk '{ print length($0) }'` mod=`expr $length % 3` div3=`expr $length / 3` if [[ $mod -ne 0 ]] then dollar_fin=`echo $dollar_amt | cut -c 1-$mod` fi modp1=`expr $mod + 1` incr=`expr $mod + 3` for (( i = 0; i < $div3; i++ )) do mySub=`echo $dollar_amt | cut -c ${modp1}-${incr}` if [[ $modp1 -ne 1 ]] then dollar_fin=`echo ${dollar_fin},${mySub}` else dollar_fin=`echo ${dollar_fin}${mySub}` fi incr=`expr $incr + 3` modp1=`expr $modp1 + 3` done if [[ "x${cent_amt}x" != "xx" ]] then dollar_fin=`echo ${dollar_fin}${cent_amt}` fi echo "$"$dollar_fin } #******************************************************* dollar_format=`formatCurr(MONRUBRO)` echo "$dollar_format" >> $FAXFILE
Last edited by cscgal; Nov 6th, 2008 at 12:18 pm. Reason: Added code tags
•
•
Join Date: Apr 2008
Posts: 58
Reputation:
Solved Threads: 9
Your first problem is that you need to define the function above where you call it from - so you should have a functions section at the top of your script, which is where my code should be. I'm assuming your script is trying to run the function on line 62 and running into the trouble there.
Secondly, you would need to modify the script so that it doesn't output the dollar sign, or the cents; which means, probably cut out from lines 70-76 and 103-106; and change 108 to "echo $dollar_fin".
You might also want to change the variable names and function name to reflect that you are working with numbers and not dollars.
Secondly, you would need to modify the script so that it doesn't output the dollar sign, or the cents; which means, probably cut out from lines 70-76 and 103-106; and change 108 to "echo $dollar_fin".
You might also want to change the variable names and function name to reflect that you are working with numbers and not dollars.
![]() |
Other Threads in the Shell Scripting Forum
- Previous Thread: problem running mysql shell script
- Next Thread: bash:redirecting stdin to at command
| Thread Tools | Search this Thread |





