这个问题其实本身的难度不是很大:题目如下:
如果用英文写出数字1到5: one, two, three, four, five, 那么一共需要3 + 3 + 5 + 4 + 4 = 19个字母。
如果数字1到1000(包含1000)用英文写出,那么一共需要多少个字母?
注意: 空格和连字符不算在内。例如,342 (three hundred and forty-two)包含23个字母; 115 (one hundred and fifteen)包含20个字母。"and" 的使用与英国标准一致。我首先的想法,写一个翻译数字成英文的程序,但是有点小难度,然后本着"不要重复造轮子的”理念,到网上看一看有没有能够翻译数字成英语的程序;还真找到了,有一个JS的程序可以非常好的完成这一任务。大家可以到这一网址去看看:http://www.pigzz.com/201011/111010602010.html,(在后面也贴出来了)非常的短小精悍,我有空会参考这个程序用perl实现这个功能,现在先解决第17题。
虽然这里能够翻译的很好,但是我并不会JS,或者说不会在perl中调用JS,这个程序对我没什么用处。
Excel初步翻译:
绝望中我发现Excel也可以实现这个功能。网址如下:http://support.microsoft.com/kb/213360
鉴于以后可能还会用到,我把原文贴在文章的后面。
里面的原理就是利用Excel VBA写的代码复制过去以后,然后再excel中调用这个函数。
我们来看一看结果(其实有些不是很完美,所以用到vim的出场):
这里出现的结果有几点和我们的标准翻译不符合,当然我们要知道标准翻译时什么样子的,后面我也贴出来了
1.Dollars and No Cents,用vim删除的时候注意one 后面跟的是Dollar是单数的形式
2.Hundred后面应该跟着and
也就是说这个结果是不完全的,是要经过修改的,但是大部分内容还是给我翻译出来了
vim修饰
1.我们先把所有的翻译好的结果复制到.txt文件中
2.删除Dollars and No Cents,代码如下:#别忘了删除one 后面的dollar
:%s/Dollars and No Cents//g
3.Hundred后面加and,(这里也有一个特殊情况,也就是整百后面不用and 所以要手动删除一下)
:%s/Hundred/Hundred and/g
4合并所有的行
1000J
:%s/s\//g
6.$把光标移动到行尾,看看结果就OK了
看右下角21124,就是结果,注意前面的1,表示的是第一行,别当成答案了。
英语数字翻译规则
【翻译规则】
n 对于三位以内的整数 (ABC),翻译的模式为 :
A=BC=0 => zero
A hundred and BC (A>0, BC>0)
BC (A=0,BC>0)
A hundred (A>0,BC=0)
对于两位数BC部分的翻译, 使用基本的数字翻译英文的规则即可
下面给出二位数内的英文翻译表
数字 | 英文 | 数字 | 英文 | 数字 | 英文 |
1 | one | 2 | two | 3 | three |
4 | four | 5 | five | 6 | six |
7 | seven | 8 | eight | 9 | nine |
10 | ten | 11 | eleven | 12 | twelve |
13 | thirteen | 14 | fourteen | 15 | fifteen |
16 | sixteen | 17 | seventeen | 18 | eighteen |
19 | nineteen | 20 | twenty | 30 | thirty |
40 | forty | 50 | fifty | 60 | sixty |
70 | seventy | 80 | eighty | 90 | ninety |
对于其他的二位数BC,其翻译形式均为 B-C,例如28则翻译为 twenty-eight
n 对于一个长整数,可以把它从个位数字开始,每三位分为一组,例如:
5678120000 => 5,678,120,000
从右边向左边数,第一个逗号为 thousand ,第二个逗号为 million,第三个逗号为billion;
然后对每一组数字进行翻译,上面的四组数字分别为:
five , six hundred and seventy-eight , one hundred and twenty , zero
然后把逗号对应的单词补充并且串联起来:
five billion six hundred and seventy-eight million one hundred and twenty thousand zero
然后,把 连续的 zero (1个或者多个) 改为 and
five billion six hundred and seventy-eight million one hundred and twenty thousand and
最后,去掉最右边所有的 and
five billion six hundred and seventy-eight million one hundred and twenty thousand
输入
【输入格式】
输入为一行,是一个十位以内的整数输出
【输出格式】
输出只有一行,为翻译的英文小写字母,每两个英文字母用空格隔开
样例输入
样例输出
如何在 Excel 中将数值转换为英文单词
本文包含 Microsoft Visual Basic for Applications 函数示例,您可以使用这些函数将 Microsoft Excel 工作表单元格中的数值转换为等效的英文单词。Microsoft 提供的编程示例只用于演示目的,不带任何明示或暗示担保。这包括但不限于对适销性或特定用途适用性的暗示担保。本文假定您熟悉演示的编程语言以及用于创建和调试过程的工具。Microsoft 支持工程师可以帮助解释某个特定过程的功能。但是他们不会修改这些示例以提供额外的功能,也不会构建过程以满足您的特定要求。
如何创建名为 SpellNumber 的示例函数
- 启动 Microsoft Excel。
- 按 Alt+F11 启动 Visual Basic 编辑器。
- 在“插入”菜单上,单击“模块”。
- 在模块表中键入下面的代码。
Option Explicit 'Main Function Function SpellNumber(ByVal MyNumber) Dim Dollars, Cents, Temp Dim DecimalPlace, Count ReDim Place(9) As String Place(2) = " Thousand " Place(3) = " Million " Place(4) = " Billion " Place(5) = " Trillion " ' String representation of amount. MyNumber = Trim(Str(MyNumber)) ' Position of decimal place 0 if none. DecimalPlace = InStr(MyNumber, ".") ' Convert cents and set MyNumber to dollar amount. If DecimalPlace > 0 Then Cents = GetTens(Left(Mid(MyNumber, DecimalPlace + 1) & _ "00", 2)) MyNumber = Trim(Left(MyNumber, DecimalPlace - 1)) End If Count = 1 Do While MyNumber <> "" Temp = GetHundreds(Right(MyNumber, 3)) If Temp <> "" Then Dollars = Temp & Place(Count) & Dollars If Len(MyNumber) > 3 Then MyNumber = Left(MyNumber, Len(MyNumber) - 3) Else MyNumber = "" End If Count = Count + 1 Loop Select Case Dollars Case "" Dollars = "No Dollars" Case "One" Dollars = "One Dollar" Case Else Dollars = Dollars & " Dollars" End Select Select Case Cents Case "" Cents = " and No Cents" Case "One" Cents = " and One Cent" Case Else Cents = " and " & Cents & " Cents" End Select SpellNumber = Dollars & Cents End Function ' Converts a number from 100-999 into text Function GetHundreds(ByVal MyNumber) Dim Result As String If Val(MyNumber) = 0 Then Exit Function MyNumber = Right("000" & MyNumber, 3) ' Convert the hundreds place. If Mid(MyNumber, 1, 1) <> "0" Then Result = GetDigit(Mid(MyNumber, 1, 1)) & " Hundred " End If ' Convert the tens and ones place. If Mid(MyNumber, 2, 1) <> "0" Then Result = Result & GetTens(Mid(MyNumber, 2)) Else Result = Result & GetDigit(Mid(MyNumber, 3)) End If GetHundreds = Result End Function ' Converts a number from 10 to 99 into text. Function GetTens(TensText) Dim Result As String Result = "" ' Null out the temporary function value. If Val(Left(TensText, 1)) = 1 Then ' If value between 10-19... Select Case Val(TensText) Case 10: Result = "Ten" Case 11: Result = "Eleven" Case 12: Result = "Twelve" Case 13: Result = "Thirteen" Case 14: Result = "Fourteen" Case 15: Result = "Fifteen" Case 16: Result = "Sixteen" Case 17: Result = "Seventeen" Case 18: Result = "Eighteen" Case 19: Result = "Nineteen" Case Else End Select Else ' If value between 20-99... Select Case Val(Left(TensText, 1)) Case 2: Result = "Twenty " Case 3: Result = "Thirty " Case 4: Result = "Forty " Case 5: Result = "Fifty " Case 6: Result = "Sixty " Case 7: Result = "Seventy " Case 8: Result = "Eighty " Case 9: Result = "Ninety " Case Else End Select Result = Result & GetDigit _ (Right(TensText, 1)) ' Retrieve ones place. End If GetTens = Result End Function ' Converts a number from 1 to 9 into text. Function GetDigit(Digit) Select Case Val(Digit) Case 1: GetDigit = "One" Case 2: GetDigit = "Two" Case 3: GetDigit = "Three" Case 4: GetDigit = "Four" Case 5: GetDigit = "Five" Case 6: GetDigit = "Six" Case 7: GetDigit = "Seven" Case 8: GetDigit = "Eight" Case 9: GetDigit = "Nine" Case Else: GetDigit = "" End Select End Function
如何使用 SpellNumber 示例函数
要使用该示例函数将某数字更改为书面文本,请使用下列示例中演示的方法之一:方法 1:直接输入
通过将下面的公式输入单元格中,可以将 32.50 更改为“Thirty Two Dollars and Fifty Cents”:方法 2:单元格引用
可以引用工作簿中的其他单元格。例如,在单元格 A1 中输入数字 32.50,然后在另一单元格中键入下面的公式:方法 3:粘贴函数或插入函数
可以使用“粘贴函数”(在 Excel 2000 和 Excel 2002 中)或“插入函数”(在 Excel 2003 中)来将自定义函数输入工作表中。Excel 2000 和 Excel 2002
要使用“粘贴函数”,请按照下列步骤操作:- 选择所需的单元格。
- 单击“常用”工具栏中的“粘贴函数”。
- 在“函数类别”下,单击“用户定义”。
- 在“函数名称”下,单击“SpellNumber”,然后单击“确定”。
- 输入所需的数字或单元格引用,然后单击“确定”。
- 单击“完成”。
Excel 2003
要使用“插入函数”,请按照下列步骤操作:- 选择所需的单元格。
- 单击“常用”工具栏中的“插入函数”。
- 在“或选择类别”下,单击“用户定义”。
- 在“选择函数”列表中,单击“SpellNumber”,然后单击“确定”。
- 输入所需的数字或单元格引用,然后单击“确定”。
JS翻译代码:
<html>
<head>
<title>数字转换成英文的JavaScript 站长学院pigzz.com</title>
<script>
var arr1=new Array(""," thousand"," million"," billion")
var arr2=new Array("zero","ten","twenty","thirty","forty","fifty","sixty","seventy","eighty","ninety")
var arr3=new Array("zero","one","two","three","four","five","six","sever","eight","nine");
var arr4=new Array("ten","eleven","twelve","thirteen","fourteen","fifteen","sixteen","seventeen","eighteen","nineteen");
function Translate(num){
var len=num.length,i,j=0,strRet="";
var cols=Math.ceil(len/3);
var first=len-cols*3
var strRet=""
for(i=first;i<len;i+=3){
++j;
if(i>=0)
num3=num.substring(i,i+3)
else
num3=num.substring(0,first+3)
strEng=English(num3)
if(strEng!=""){
if(strRet!="") strRet+=","
strRet+=English(num3)+arr1[cols-j]
}
}
return strRet
}
function English(num){
strRet=""
if((num.length==3) && (num.substr(0,3)!="000")){
if((num.substr(0,1)!="0")){
strRet+=arr3[num.substr(0,1)]+" hundred"
if(num.substr(1,2)!="00")strRet+=" and "
}
num=num.substring(1);
}
if((num.length==2)){
if((num.substr(0,1)=="0")){
num=num.substring(1)
}
else if((num.substr(0,1)=="1")){
strRet+=arr4[num.substr(1,2)]
}
else{
strRet+=arr2[num.substr(0,1)]
if(num.substr(1,1)!="0")strRet+="-"
num=num.substring(1)
}
}
if((num.length==1) && (num.substr(0,1)!="0")){
strRet+=arr3[num.substr(0,1)]
}
return strRet;
}
</script>
</head>
<body>
<input id=number value=654321><input type=button value=翻译 οnclick=alert(Translate(document.all.number.value))> <p>小猪站长学院致力于网页标准的传播,提供DIV CSS XHTML等学习教材,标准化的网页代码</p>
<p>符合W3C标准的网页设计,提供建站资源,设计字体等资源下载的综合性站长学习平台</p>
<p>你所下载的代码来自<a href="http://www.pigzz.com" _fcksavedurl="http://www.pigzz.com">小猪站长学院</a> ,欢迎下载
使用</p>
</body>
</html>