前一段时间有过一个面试,第一轮是技术测试。第一道测试题如下:
写一段C#,把一个金额转化成英文,如123456.78转化成One hundred and twenty three thousand four hundred and fifty six dollars seventy eight sents.
当然,只要把大致写出来就可以了,并不要求100%正确,但思路要正确。
这只是第一道,后面还有三道算法题和两道SQL题, 共两个小时,比较紧张。
我的答案如下,这是我回家后写的,考试的时候只是写了一个大概:
===================================================================
private String getNumberEnglishStr ( float pfNumber ) {
String lsNumber = pfNumber.ToString ();
String lsResult = "";
int liDecimalPos = lsNumber.IndexOf ( "." );
String lsDecimal = ( liDecimalPos < 0 ? "" : lsNumber.Substring ( liDecimalPos + 1 ) ) ;
String lsInteger = ( liDecimalPos < 0 ? lsNumber : lsNumber.Substring ( 0, liDecimalPos ) );
String lsLeftInteger = lsInteger;
Int32 liGroup = 1;
String lsCurrentNumber;
int liCurrentNumber;
StringBuilder lsbResult;
while ( ! String.IsNullOrEmpty( lsLeftInteger ) ) {
lsbResult = new StringBuilder ();
if ( lsLeftInteger.Length > 3 ) {
lsCurrentNumber = lsLeftInteger.Substring ( lsLeftInteger.Length - 3, 3 );
lsLeftInteger = lsLeftInteger.Substring ( 0, lsLeftInteger.Length - 3 );
} else {
lsCurrentNumber = lsLeftInteger;
lsLeftInteger = "";
}
// reomve prefix 0
liCurrentNumber = int.Parse( lsCurrentNumber );
lsCurrentNumber = liCurrentNumber.ToString ();
if ( liCurrentNumber != 0 ) {
Char[] laryChar = lsCurrentNumber.Reverse().ToArray<Char > ();
if ( laryChar.Length == 3 ) {
lsbResult.Append ( " " );
lsbResult.Append( this.GetHundredNumber( int.Parse( laryChar[ 2 ].ToString () )));
if ( laryChar[ 0 ] != '0' || laryChar[ 1 ] != '0' ) {
lsbResult.Append ( " and" );
}
}
if ( laryChar.Length >= 2 ) {
lsbResult.Append ( " " );
lsbResult.Append ( this.GetSecondNumber ( int.Parse ( laryChar[ 1 ].ToString () ), int.Parse ( laryChar[0].ToString() ) ) );
} else {
lsbResult.Append ( " " );
lsbResult.Append ( this.GetDigitalNumber ( int.Parse ( laryChar[ 0 ].ToString () ) ) );
}
}
if ( liGroup > 1 ) {
lsbResult.Append ( " " );
lsbResult.Append ( Enum.GetName ( typeof ( ENumber ), liGroup ) );
}
liGroup *= 1000;
lsResult = lsbResult.ToString () + " " + lsResult ;
}
lsResult = lsResult.Trim ();
if ( ! String.IsNullOrEmpty ( lsResult ) ) {
if ( lsResult == "One" ) {
lsResult += " dollar";
} else {
lsResult += " dollars";
}
}
if (! String.IsNullOrEmpty( lsDecimal )) {
lsResult += " " +GetSecondNumber (int.Parse( lsDecimal.Substring ( 0, 1 )),int.Parse( lsDecimal.Substring ( 1, 1 )) ) + " cents";
}
return lsResult;
}
private String GetHundredNumber ( int piHundred ) {
String lsResult = "" ;
if ( piHundred != 0 ) {
lsResult = Enum.GetName ( typeof ( ENumber ), piHundred ) + " " + Enum.GetName ( typeof ( ENumber ), 100 );
}
return lsResult;
}
private String GetSecondNumber ( int piSecond, int piThird ) {
String lsResult = "";
if ( piSecond != 1 && piSecond != 0 ) {
lsResult = Enum.GetName ( typeof ( ENumber ), piSecond * 10 );
if ( piThird != 0 ) {
lsResult = lsResult + " " + Enum.GetName ( typeof ( ENumber ), piThird );
}
} else {
lsResult = Enum.GetName ( typeof ( ENumber ), piSecond * 10 + piThird );
}
return lsResult;
}
private String GetDigitalNumber ( int piThird ) {
if ( piThird != 0 ) {
return Enum.GetName ( typeof ( ENumber ), piThird );
} else {
return "";
}
}
public enum ENumber {
Zero = 0 ,
One = 1,
Two = 2,
Three = 3,
Four = 4,
Five = 5,
Six = 6,
Seven = 7,
Eight =8,
Nine = 9,
Eleven =11,
Tweleve = 12,
Thirteen = 13,
Forteen = 14,
Fifteen = 15,
Sixteen = 16,
Seventeen = 17,
Eighteen = 18,
Nineteen = 19,
Twenty = 20,
Thirty = 30,
Forty = 40,
Fifty = 50,
Sixty = 60,
Seventy = 70,
Eighty = 80,
Ninety = 90,
Hundred = 100,
Thousand = 1000,
Million = 1000000,
Billion = 1000000000,
Trillion = 1000000000
}