Index: channel.c
===================================================================
--- channel.c	(revision 29902)
+++ channel.c	(working copy)
@@ -4274,6 +4274,14 @@
         return ast_say_phonetic_str_full(chan, str, ints, lang, -1, -1);
 }
 
+int ast_say_currency_str(struct ast_channel *chan, const char *str,
+	const char *ints, const char *lang)
+{
+	return ast_say_currency_str_full(chan, str, ints, lang, -1, -1);
+}
+
+
+
 int ast_say_digits_full(struct ast_channel *chan, int num,
 	const char *ints, const char *lang, int audiofd, int ctrlfd)
 {
Index: include/asterisk/say.h
===================================================================
--- include/asterisk/say.h	(revision 29902)
+++ include/asterisk/say.h	(working copy)
@@ -142,6 +142,10 @@
 
 SAY_EXTERN int (* ast_say_phonetic_str_full)(struct ast_channel *chan, const char *num, const char *ints, const char *lang, int audiofd, int ctrlfd) SAY_INIT(ast_say_phonetic_str_full);
 
+int ast_say_currency_str(struct ast_channel *chan, const char *str, const char *ints, const char *lang);
+
+SAY_EXTERN int (* ast_say_currency_str_full)(struct ast_channel *chan, const char *str, const char *ints, const char *lang, int audiofd, int ctrlfd) SAY_INIT(ast_say_currency_str_full);
+
 SAY_EXTERN int (* ast_say_datetime)(struct ast_channel *chan, time_t t, const char *ints, const char *lang) SAY_INIT(ast_say_datetime);
 SAY_EXTERN int (* ast_say_time)(struct ast_channel *chan, time_t t, const char *ints, const char *lang) SAY_INIT(ast_say_time);
 
Index: say.c
===================================================================
--- say.c	(revision 29902)
+++ say.c	(working copy)
@@ -375,6 +375,79 @@
 static int ast_say_datetime_from_now_fr(struct ast_channel *chan, time_t t, const char *ints, const char *lang);
 static int ast_say_datetime_from_now_pt(struct ast_channel *chan, time_t t, const char *ints, const char *lang);
 
+/* Prototype for different say currency stuff */
+static int ast_say_currency_full_en(struct ast_channel *chan, const char *str, const char *ints, const char *language, int audiofd, int ctrlfd);
+static int ast_say_currency_full_fr(struct ast_channel *chan, const char *str, const char *ints, const char *language, int audiofd, int ctrlfd);
+
+static int say_currency_str_full(struct ast_channel *chan, const char *str, const char *ints, const char *language, int audiofd, int ctrlfd)
+{
+	/* French syntax */
+	if (!strcasecmp(language, "fr") ) {      
+		return(ast_say_currency_full_fr(chan, str, ints, language, audiofd, ctrlfd));
+	}
+
+	return ast_say_currency_full_en(chan, str, ints, language, audiofd, ctrlfd);	
+}
+
+
+static int ast_say_currency_full_en(struct ast_channel *chan, const char *str, const char *ints, const char *language, int audiofd, int ctrlfd)
+{
+	int res = 0;
+	ast_log(LOG_DEBUG, "input=%s\n",str);
+
+	char *cents, *dol;
+	cents = ast_strdupa(str);
+	dol = strsep(&cents,".");
+
+	res = ast_say_number_full(chan,atoi(dol),ints,language,NULL,audiofd,ctrlfd);
+	
+	if ( atoi(dol) == 1 ) 
+		wait_file(chan,ints,"letters/dollar",language);
+	else
+		wait_file(chan,ints,"digits/dollars",language);
+
+	if ( cents ) {
+		wait_file(chan,ints,"vm-and",language);
+		res = ast_say_number_full(chan,atoi(cents),ints,language,NULL,audiofd,ctrlfd);
+		if ( atoi(cents) == 1 )
+			res = wait_file(chan,ints,"cent",language);
+		else
+			res = wait_file(chan,ints,"cents",language);
+	} else {
+		ast_log(LOG_DEBUG, "no cents\n");
+	}
+
+	return res;
+}
+
+
+static int ast_say_currency_full_fr(struct ast_channel *chan, const char *str, const char *ints, const char *language, int audiofd, int ctrlfd)
+{
+	int res = 0;
+	ast_log(LOG_DEBUG, "input=%s\n",str);
+
+	char *cents, *dol;
+	cents = ast_strdupa(str);
+	dol = strsep(&cents,".");
+
+	res = ast_say_number_full(chan,atoi(dol),ints,language,NULL,audiofd,ctrlfd);
+	
+	/* Since the ponunciation is dollars for any number */
+	wait_file(chan,ints,"digits/dollars",language);
+
+	if ( cents ) {
+		wait_file(chan,ints,"vm-and",language);
+		res = ast_say_number_full(chan,atoi(cents),ints,language,NULL,audiofd,ctrlfd);
+		/* Since the ponunciation is cents for any number */
+		res = wait_file(chan,ints,"cents",language);
+	} else {
+		ast_log(LOG_DEBUG, "no cents\n");
+	}
+
+	return res;
+}
+
+
 static int wait_file(struct ast_channel *chan, const char *ints, const char *file, const char *lang) 
 {
 	int res;
@@ -6406,6 +6479,7 @@
 	ast_say_digit_str_full = say_digit_str_full;
 	ast_say_character_str_full = say_character_str_full;
 	ast_say_phonetic_str_full = say_phonetic_str_full;
+	ast_say_currency_str_full = say_currency_str_full;
 	ast_say_datetime = say_datetime;
 	ast_say_time = say_time;
 	ast_say_date = say_date;
Index: pbx.c
===================================================================
--- pbx.c	(revision 29902)
+++ pbx.c	(working copy)
@@ -233,6 +233,7 @@
 static int pbx_builtin_saydigits(struct ast_channel *, void *);
 static int pbx_builtin_saycharacters(struct ast_channel *, void *);
 static int pbx_builtin_sayphonetic(struct ast_channel *, void *);
+static int pbx_builtin_saycurrency(struct ast_channel *, void *);
 int pbx_builtin_setvar(struct ast_channel *, void *);
 static int pbx_builtin_importvar(struct ast_channel *, void *);
 
@@ -458,7 +459,13 @@
 	"    m[(x)] - Provide music on hold to the caller while waiting for an extension.\n"
 	"               Optionally, specify the class for music on hold within parenthesis.\n"
 	},
+	{ "SayCurrency", pbx_builtin_saycurrency,
+	"Say Currency",
+	"  SayCurrency(price): This application will stream the price\n"
+	" In format like: 46 dollars and 87 cents.\n"
+	},
 
+
 };
 
 static struct ast_context *contexts = NULL;
@@ -5567,6 +5574,31 @@
 	return res;
 }
 
+static int pbx_builtin_saycurrency(struct ast_channel *chan, void *data)
+{
+	int res = 0;
+	char *parse;
+	AST_DECLARE_APP_ARGS(args,
+		AST_APP_ARG(number);
+		AST_APP_ARG(name); /*XXX supports EUR? */
+	);
+
+	if (ast_strlen_zero(data))
+		ast_log(LOG_WARNING, "SayCurrency requires an argument (number)\n");
+
+	parse = ast_strdupa(data);
+
+	AST_STANDARD_APP_ARGS(args, parse);
+
+	if (args.number) {
+		ast_log(LOG_DEBUG, "streaming currency=%s\n",args.number);
+		res = ast_say_currency_str(chan, args.number, "", chan->language);
+	}
+	return res;
+}
+
+
+
 int load_pbx(void)
 {
 	int x;
