/* AmountInWords Copyright (C) 2003 Terry Voss (http://aspalliance.com/164_Convert_Currency_to_dollar_words) Originally in VB.NET Translated to C# 2.0 by Rizal Almashoor on 5 December 2006 This library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation; either version 2.1 of the License, or (at your option) any later version. This library is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with this library; if not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA Example Usage: AmountInWords aiw = new AmountInWords(); // Let's say we want 42 to be "Forty Two Dollars" and not "Forty Two Dollars And Zero Cents" aiw.IncludeZeroMinorCurrencyUnit = false; // Default is "Dollars" and "Cents" String amountInWords = aiw.Convert(123456789.12); // Other currencies: aiw = new AmountInWords("Pound", "Pounds", "Penny", "Pence", true); amountInWords = aiw.Convert(123456789.12); aiw = new AmountInWords("Ringgit", "Ringgit", "Sen", "Sen", true); amountInWords = aiw.Convert(123456789.12); */ using System.Text; using System.Text.RegularExpressions; public class AmountInWords { private String _majorCurrencyUnitSingular; private String _majorCurrencyUnitPlural; private String _minorCurrencyUnitSingular; private String _minorCurrencyUnitPlural; private bool _includeZeroMinorCurrencyUnit; private String _oneWords; private String[] _ones; private String _tenWords; private String[] _tens; public String MajorCurrencyUnitSingular { get { return _majorCurrencyUnitSingular; } set { _majorCurrencyUnitSingular = (value == null ? "" : value); } } public String MajorCurrencyUnitPlural { get { return _majorCurrencyUnitPlural; } set { _majorCurrencyUnitPlural = (value == null ? "" : value); } } public String MinorCurrencyUnitSingular { get { return _minorCurrencyUnitSingular; } set { _minorCurrencyUnitSingular = (value == null ? "" : value); } } public String MinorCurrencyUnitPlural { get { return _minorCurrencyUnitPlural; } set { _minorCurrencyUnitPlural = (value == null ? "" : value); } } public bool IncludeZeroMinorCurrencyUnit { get { return _includeZeroMinorCurrencyUnit; } set { _includeZeroMinorCurrencyUnit = value; } } public AmountInWords() { _majorCurrencyUnitSingular = "Dollar"; _majorCurrencyUnitPlural = "Dollars"; _minorCurrencyUnitSingular = "Cent"; _minorCurrencyUnitPlural = "Cents"; _includeZeroMinorCurrencyUnit = true; _InitializeWords(); } public AmountInWords(String majorCurrencyUnitSingular, String majorCurrencyUnitPlural, String minorCurrencyUnitSingular, String minorCurrencyUnitPlural, bool includeZeroMinorCurrencyUnit) { _majorCurrencyUnitSingular = (majorCurrencyUnitSingular == null ? "" : majorCurrencyUnitSingular); _majorCurrencyUnitPlural = (majorCurrencyUnitPlural == null ? "" : majorCurrencyUnitPlural); _minorCurrencyUnitSingular = (minorCurrencyUnitSingular == null ? "" : minorCurrencyUnitSingular); _minorCurrencyUnitPlural = (minorCurrencyUnitPlural == null ? "" : minorCurrencyUnitPlural); _includeZeroMinorCurrencyUnit = includeZeroMinorCurrencyUnit; _InitializeWords(); } private void _InitializeWords() { _oneWords = ",One,Two,Three,Four,Five,Six,Seven,Eight,Nine,Ten,Eleven,Twelve,Thirteen,Fourteen,Fifteen,Sixteen,Seventeen,Eighteen,Nineteen"; _ones = _oneWords.Split(",".ToCharArray()); _tenWords = ",Ten,Twenty,Thirty,Forty,Fifty,Sixty,Seventy,Eighty,Ninety"; _tens = _tenWords.Split(",".ToCharArray()); } public String Convert(int number) { return Convert(System.Convert.ToDecimal(number)); } public String Convert(double number) { return Convert(System.Convert.ToDecimal(number)); } public String Convert(decimal number) { String input = number.ToString("0.00"); if (input.Length > 12) return "Error in input value"; StringBuilder output = new StringBuilder(); String dollars = input.Substring(0, input.IndexOf(".")).PadLeft(9, '0'); String cents = input.Substring(input.IndexOf(".") + 1).PadRight(2, '0'); if (cents.Equals("00")) cents = "0"; int mill = System.Convert.ToInt32(dollars.Substring(0, 3)); String mills = _ConvertHundreds(mill); int thou = System.Convert.ToInt32(dollars.Substring(3, 3)); String thous = _ConvertHundreds(thou); int hund = System.Convert.ToInt32(dollars.Substring(6, 3)); String hunds = _ConvertHundreds(hund); int cent = System.Convert.ToInt32(cents); cents = _ConvertHundreds(cent); if (mills.Length > 0) output.Append(mills + " Million "); if (thous.Length > 0) output.Append(thous + " Thousand "); if (hunds.Length > 0) output.Append(hunds + " "); if (output.Length == 0) output.Append("Zero "); output.Append(_majorCurrencyUnitPlural); if (cents.Length > 0) output.Append(" And " + cents + " " + _minorCurrencyUnitPlural); if (cents.Length == 0 && _includeZeroMinorCurrencyUnit) output.Append(" And Zero " + _minorCurrencyUnitPlural); output.Replace("One " + _majorCurrencyUnitPlural, "One " + _majorCurrencyUnitSingular); output.Replace("One " + _minorCurrencyUnitPlural, "One " + _minorCurrencyUnitSingular); Regex re = new Regex(@"\s\s+"); return re.Replace(output.ToString(), " ").Trim(); } private String _ConvertHundreds(int input) { StringBuilder output = new StringBuilder(); if (input <= 99) output.Append(_ConvertTens(input)); else { output.Append(_ones[(int)Math.Floor(input / 100.0)]); output.Append(" Hundred "); if (input - (int)Math.Floor(input / 100.0) * 100 == 0) output.Append(""); else output.Append("" + _ConvertTens(input - (int)Math.Floor(input / 100.0) * 100)); } return output.ToString(); } private String _ConvertTens(int input) { StringBuilder output = new StringBuilder(); if (input < 20) { output.Append(_ones[input]); input = 0; } else { output.Append(_tens[(int)Math.Floor(input / 10.0)]); input -= (int)Math.Floor(input / 10.0) * 10; } output.Append(_ones[input].Trim().Length == 0 ? "" : " " + _ones[input]); return output.ToString(); } }