| Author: Durga Prasad 10 Oct 2008 | Member Level: Gold | Rating:    Points: 6 |
Declarations
Dim mOnesArray(8) As String Dim mOneTensArray(9) As String Dim mTensArray(7) As String Dim mPlaceValues(4) As String
Code:
Public Class clsConversion
Dim mOnesArray(8) As String Dim mOneTensArray(9) As String Dim mTensArray(7) As String Dim mPlaceValues(4) As String
Public Sub New()
mOnesArray(0) = "one" mOnesArray(1) = "two" mOnesArray(2) = "three" mOnesArray(3) = "four" mOnesArray(4) = "five" mOnesArray(5) = "six" mOnesArray(6) = "seven" mOnesArray(7) = "eight" mOnesArray(8) = "nine"
mOneTensArray(0) = "ten" mOneTensArray(1) = "eleven" mOneTensArray(2) = "twelve" mOneTensArray(3) = "thirteen" mOneTensArray(4) = "fourteen" mOneTensArray(5) = "fifteen" mOneTensArray(6) = "sixteen" mOneTensArray(7) = "seventeen" mOneTensArray(8) = "eightteen" mOneTensArray(9) = "nineteen"
mTensArray(0) = "twenty" mTensArray(1) = "thirty" mTensArray(2) = "forty" mTensArray(3) = "fifty" mTensArray(4) = "sixty" mTensArray(5) = "seventy" mTensArray(6) = "eighty" mTensArray(7) = "ninety"
mPlaceValues(0) = "hundred" mPlaceValues(1) = "thousand" mPlaceValues(2) = "million" mPlaceValues(3) = "billion" mPlaceValues(4) = "trillion"
End Sub
Protected Function GetOnes(ByVal OneDigit As Integer) As String
GetOnes = ""
If OneDigit = 0 Then Exit Function End If
GetOnes = mOnesArray(OneDigit - 1)
End Function
Protected Function GetTens(ByVal TensDigit As Integer) As String
GetTens = ""
If TensDigit = 0 Or TensDigit = 1 Then Exit Function End If
GetTens = mTensArray(TensDigit - 2)
End Function
Public Function ConvertNumberToWords(ByVal NumberValue As String) As String
Dim Delimiter As String = " " Dim TensDelimiter As String = "-" Dim mNumberValue As String = "" Dim mNumbers As String = "" Dim mNumWord As String = "" Dim mFraction As String = "" Dim mNumberStack() As String Dim j As Integer = 0 Dim i As Integer = 0 Dim mOneTens As Boolean = False
ConvertNumberToWords = ""
' validate input Try j = CDbl(NumberValue) Catch ex As Exception ConvertNumberToWords = "Invalid input." Exit Function End Try
' get fractional part {if any} If InStr(NumberValue, ".") = 0 Then ' no fraction mNumberValue = NumberValue Else mNumberValue = Microsoft.VisualBasic.Left(NumberValue, InStr(NumberValue, ".") - 1) mFraction = Mid(NumberValue, InStr(NumberValue, ".")) ' + 1) mFraction = Math.Round(CSng(mFraction), 2) * 100
If CInt(mFraction) = 0 Then mFraction = "" Else mFraction = "&& " & mFraction & "/100" End If End If mNumbers = mNumberValue.ToCharArray
' move numbers to stack/array backwards For j = mNumbers.Length - 1 To 0 Step -1 ReDim Preserve mNumberStack(i)
mNumberStack(i) = mNumbers(j) i += 1 Next
For j = mNumbers.Length - 1 To 0 Step -1 Select Case j Case 0, 3, 6, 9, 12 ' ones value If Not mOneTens Then mNumWord &= GetOnes(Val(mNumberStack(j))) & Delimiter End If
Select Case j Case 3 ' thousands mNumWord &= mPlaceValues(1) & Delimiter
Case 6 ' millions mNumWord &= mPlaceValues(2) & Delimiter
Case 9 ' billions mNumWord &= mPlaceValues(3) & Delimiter
Case 12 ' trillions mNumWord &= mPlaceValues(4) & Delimiter End Select
Case Is = 1, 4, 7, 10, 13 ' tens value If Val(mNumberStack(j)) = 0 Then mNumWord &= GetOnes(Val(mNumberStack(j - 1))) & Delimiter mOneTens = True Exit Select End If
If Val(mNumberStack(j)) = 1 Then mNumWord &= mOneTensArray(Val(mNumberStack(j - 1))) & Delimiter mOneTens = True Exit Select End If
mNumWord &= GetTens(Val(mNumberStack(j)))
' this places the tensdelimiter; check for succeeding 0 If Val(mNumberStack(j - 1)) <> 0 Then mNumWord &= TensDelimiter End If mOneTens = False
Case Else ' hundreds value mNumWord &= GetOnes(Val(mNumberStack(j))) & Delimiter
If Val(mNumberStack(j)) <> 0 Then mNumWord &= mPlaceValues(0) & Delimiter End If End Select Next
Return mNumWord & mFraction
End Function
End Class
|
| Author: Mari raj k 10 Oct 2008 | Member Level: Silver | Rating:  Points: 6 |
using System;
namespace custom.util
{
public class NumberToEnglish
{
public String changeNumericToWords(double numb)
{
String num = numb.ToString();
return changeToWords(num, false);
}
public String changeCurrencyToWords(String numb)
{
return changeToWords(numb, true);
}
public String changeNumericToWords(String numb)
{
return changeToWords(numb, false);
}
public String changeCurrencyToWords(double numb)
{
return changeToWords(numb.ToString(), true);
}
private String changeToWords(String numb, bool isCurrency)
{
String val = "", wholeNo = numb, points = "", andStr = "", pointStr="";
String endStr = (isCurrency) ? ("Only") : ("");
try
{
int decimalPlace = numb.IndexOf(".");
if (decimalPlace > 0)
{
wholeNo = numb.Substring(0, decimalPlace);
points = numb.Substring(decimalPlace+1);
if (Convert.ToInt32(points) > 0)
{
andStr = (isCurrency)?("and"):("point");// just to separate whole numbers from points/cents
endStr = (isCurrency) ? ("Cents "+endStr) : ("");
pointStr = translateCents(points);
}
}
val = String.Format("{0} {1}{2} {3}",translateWholeNumber(wholeNo).Trim(),andStr,pointStr,endStr);
}
catch { ;}
return val;
}
private String translateWholeNumber(String number)
{
string word = "";
try
{
bool beginsZero = false;//tests for 0XX
bool isDone = false;//test if already translated
double dblAmt = (Convert.ToDouble(number));
//if ((dblAmt > 0) && number.StartsWith("0"))
if (dblAmt > 0)
{//test for zero or digit zero in a nuemric
beginsZero = number.StartsWith("0");
int numDigits = number.Length;
int pos = 0;//store digit grouping
String place = "";//digit grouping name:hundres,thousand,etc...
switch (numDigits)
{
case 1://ones' range
word = ones(number);
isDone = true;
break;
case 2://tens' range
word = tens(number);
isDone = true;
break;
case 3://hundreds' range
pos = (numDigits % 3) + 1;
place = " Hundred ";
break;
case 4://thousands' range
case 5:
case 6:
pos = (numDigits % 4) + 1;
place = " Thousand ";
break;
case 7://millions' range
case 8:
case 9:
pos = (numDigits % 7) + 1;
place = " Million ";
break;
case 10://Billions's range
pos = (numDigits % 10) + 1;
place = " Billion ";
break;
//add extra case options for anything above Billion...
default:
isDone = true;
break;
}
if (!isDone)
{//if transalation is not done, continue...(Recursion comes in now!!)
word = translateWholeNumber(number.Substring(0, pos)) + place + translateWholeNumber(number.Substring(pos));
//check for trailing zeros
if (beginsZero) word = " and " + word.Trim();
}
//ignore digit grouping names
if (word.Trim().Equals(place.Trim())) word = "";
}
}
catch { ;}
return word.Trim();
}
private String tens(String digit)
{
int digt = Convert.ToInt32(digit);
String name = null;
switch (digt)
{
case 10:
name = "Ten";
break;
case 11:
name = "Eleven";
break;
case 12:
name = "Twelve";
break;
case 13:
name = "Thirteen";
break;
case 14:
name = "Fourteen";
break;
case 15:
name = "Fifteen";
break;
case 16:
name = "Sixteen";
break;
case 17:
name = "Seventeen";
break;
case 18:
name = "Eighteen";
break;
case 19:
name = "Nineteen";
break;
case 20:
name = "Twenty";
break;
case 30:
name = "Thirty";
break;
case 40:
name = "Fourty";
break;
case 50:
name = "Fifty";
break;
case 60:
name = "Sixty";
break;
case 70:
name = "Seventy";
break;
case 80:
name = "Eighty";
break;
case 90:
name = "Ninety";
break;
default:
if (digt > 0)
{
name = tens(digit.Substring(0, 1) + "0") + " " + ones(digit.Substring(1));
}
break;
}
return name;
}
private String ones(String digit)
{
int digt = Convert.ToInt32(digit);
String name = "";
switch (digt)
{
case 1:
name = "One";
break;
case 2:
name = "Two";
break;
case 3:
name = "Three";
break;
case 4:
name = "Four";
break;
case 5:
name = "Five";
break;
case 6:
name = "Six";
break;
case 7:
name = "Seven";
break;
case 8:
name = "Eight";
break;
case 9:
name = "Nine";
break;
}
return name;
}
private String translateCents(String cents)
{
String cts = "", digit = "", engOne = "";
for (int i = 0; i < cents.Length; i++)
{
digit = cents[i].ToString();
if (digit.Equals("0"))
{
engOne = "Zero";
}
else
{
engOne = ones(digit);
}
cts += " " + engOne;
}
return cts;
}
}
}
|