`
realfun
  • 浏览: 25725 次
  • 性别: Icon_minigender_1
  • 来自: 北京
文章分类
社区版块
存档分类
最新评论

用Ruby做中文数字和阿拉伯数字之间的互相转换,附简单测试代码

阅读更多
Ruby代码 : 用Ruby做中文数字和阿拉伯数字之间的互相转换
001 #中文数字和阿拉伯数字之间的互相转换
002 #  比如: 138 <=> 一百三十八
003 #
004 #作者: 半瓶墨水 http://www.2maomao.com/blog/
005 $KCODE = 'u'
006 require 'jcode'
007 require 'iconv'
008
009 $cn_nums = %w{零 一 二 三 四 五 六 七 八 九}
010 $cn_decs =   %w{十 百 千 万 十 百 千 亿}
011 $conv = Iconv . new ( 'gbk' , 'utf-8' )
012
013 $cn_nums_map = {
014     '〇' => 0 ,
015     '一' => 1 ,
016     '二' => 2 ,
017     '三' => 3 ,
018     '四' => 4 ,
019     '五' => 5 ,
020     '六' => 6 ,
021     '七' => 7 ,
022     '八' => 8 ,
023     '九' => 9 ,
024
025     '零' => 0 ,
026     '壹' => 1 ,
027     '贰' => 2 ,
028     '叁' => 3 ,
029     '肆' => 4 ,
030     '伍' => 5 ,
031     '陆' => 6 ,
032     '柒' => 7 ,
033     '捌' => 8 ,
034     '玖' => 9 ,
035
036     '貮' => 2 ,
037     '两' => 2 ,
038 }
039
040 $cn_decs_map = {
041     '个' => 1 ,
042     '十' => 10 ,
043     '拾' => 10 ,
044     '百' => 100 ,
045     '佰' => 100 ,
046     '千' => 1000 ,
047     '仟' => 1000 ,
048     '万' => 10000 ,
049     '萬' => 10000 ,
050     '亿' => 100000000 ,
051     '億' => 100000000 ,
052     '兆' => 1000000000000 ,
053 }
054
055 def uputs ( str )
056     puts $conv . iconv ( str )
057 end
058
059 class NumCnConv
060 private
061     def digit2cn ( d )
062         $cn_nums [ d - '0' [ 0 ]]
063     end
064     def is_all_zero ( str )
065         return str == ( '0' * str . size )
066     end
067
068 public
069     def num2cn ( num )
070         str = num . to_s
071 #        print str + ":"
072         result = []
073         str = str . reverse
074         zero_count = 0       #zero_count after last non-zero digit
075         index = 0            #the index for the numbers
076         first_zero = true    #don't need to insert 零 for numbers like /[1-9]+0+/
077         str_wan_yi = nil     #insert 万 & 亿 when needed
078         while index < str . size do #3 0423 4829
079             d = str [ index ]
080             #puts "index = #{index} (#{d.chr})"
081             if ( d - '0' [ 0 ] > 0 )
082                 if zero_count > 0
083                     zero_count = 0
084                     result << digit2cn ( '0' [ 0 ] ) if ! first_zero
085                     if str_wan_yi != nil
086                         result << str_wan_yi
087                         str_wan_yi = nil
088                     end
089                 end
090                 result << $cn_decs [ ( index - 1 ) % ( $cn_decs . size ) ] if index > 0
091                 result << digit2cn ( d )
092                 first_zero = false
093             else
094                 if ( index > 0 && ( index % 4 ) == 0 && ! is_all_zero ( str [ index , 4 ] ) )
095                     str_wan_yi = $cn_decs [ ( index - 1 ) % ( $cn_decs . size ) ]
096                 end
097                 zero_count += 1
098             end
099             index += 1
100         end
101         if zero_count > 0
102             zero_count = 0
103             result << digit2cn ( '0' [ 0 ] )
104         end
105         result = result . reverse
106
107         res = result . join
108         if res =~ /^一十/
109             res = res [ '一' . size , res . size - '一' . size ]
110         end
111 #        uputs res
112         return res
113     end
114
115     def cn2num ( str )
116         #remove 零
117         num_str = ''
118         last = nil
119         str . scan ( /./u ) do | c |
120             if ( ! $cn_nums_map [ c ] && ! $cn_decs_map [ c ] )
121                 uputs " #{ str }   是个错误的数字串"
122                 return nil
123             end
124             num_str += c if c != '零'
125             last = c
126         end
127         if num_str =~ /^十/
128             num_str = '一' + num_str
129         end
130
131         sums = []
132         temp_sum = 0
133         last_num = 0
134         num_str . scan ( /./u ) do | ch |
135             if num = $cn_nums_map [ ch ]
136                 last_num = num
137             else
138                 dec = $cn_decs_map [ ch ]
139                 if dec < 10000
140                     temp_sum += last_num * dec
141                 else
142                     #find back for the one that exceeds current dec
143                     sums . each_with_index do | x , i |
144                         if x < dec * 10 #10 is here for situation like 两亿亿
145                             sums [ i ] = x * dec
146                         else
147                             break
148                         end
149                     end
150                     temp_sum += last_num
151                     sums << temp_sum * dec
152                     temp_sum = 0
153                 end
154                 last_num = 0
155             end
156         end
157         sums << temp_sum + last_num
158
159         sum = 0
160         sums . each do | x |
161             sum += x
162         end
163         return sum
164     end
165 end
166
167 #$cn_nums_map.each do |key, value|
168     #uputs key + "=>" + value.to_s
169 #end
170
171 #myconv = NumCnConv.new
172 #puts myconv.cn2num('两亿亿')
173
174 #-------------------------------------------
175 #测试程序
176 require 'test\unit'
177
178 $td_map = {
179     #1 digit 个
180     '零' => 0 ,
181     '一' => 1 ,
182     '二' => 2 ,
183     '三' => 3 ,
184     '四' => 4 ,
185     '五' => 5 ,
186     '六' => 6 ,
187     '七' => 7 ,
188     '八' => 8 ,
189     '九' => 9 ,
190
191     #2 digits 十
192     '十' => 10 ,
193     '十一' => 11 ,
194     '二十' => 20 ,
195     '二十一' => 21 ,
196
197     #3 digits 百
198     '一百' => 100 ,
199     '一百零一' => 101 ,
200     '一百一十' => 110 ,
201     '一百二十三' => 123 ,
202
203     #4 digits 千
204     '一千' => 1000 ,
205     '一千零一' => 1001 ,
206     '一千零一十' => 1010 ,
207     '一千一百' => 1100 ,
208     '一千零二十三' => 1023 ,
209     '一千二百零三' => 1203 ,
210     '一千二百三十' => 1230 ,
211
212     #5 digits 万
213     #@@@@
214     '一万' => 10000 ,
215     '一万零一' => 10001 ,
216     '一万零一十' => 10010 ,
217     '一万零一百' => 10100 ,
218     '一万一千' => 11000 ,
219     '一万零一十一' => 10011 ,
220     '一万零一百零一' => 10101 ,
221     '一万一千零一' => 11001 ,
222     '一万零一百一十' => 10110 ,
223     '一万一千零一十' => 11010 ,
224     '一万一千一百' => 11100 ,
225     '一万一千一百一十'
2
1
分享到:
评论

相关推荐

    ruby测试代码6

    标题“ruby测试代码6”和描述“ruby测试代码6”暗示了这是一个关于使用Ruby语言进行的测试代码项目,可能涉及到不同的模块或者数据结构。标签“ruby测试代码6”进一步确认了这一主题。从压缩包子文件的文件名称列表...

    ruby测试代码1

    在Ruby编程语言中,测试代码扮演着至关重要的角色,它确保了代码的质量和可靠性。"ruby测试代码1"可能指的是一个具体的测试用例或者测试框架的实例,用于验证Ruby程序的功能和性能。Ruby提供了多种测试工具,如...

    ruby源代码 ruby源代码 ruby源代码 ruby源代码2

    ruby源代码 ruby源代码 ruby源代码 ruby源代码2

    ruby测试代码7

    Ruby是一种强大的动态编程语言,广泛应用...综上所述,“Ruby测试代码7”涵盖了Ruby中的测试基础、特定模块(Map和Sound)的测试策略,以及测试文化的多个方面。理解并熟练运用这些知识,可以提升代码质量和开发效率。

    ruby源代码 ruby源代码 ruby源代码 ruby源代码4

    ruby源代码 ruby源代码 ruby源代码 ruby源代码4

    ruby源代码 ruby源代码 ruby源代码 ruby源代码3

    ruby源代码 ruby源代码 ruby源代码 ruby源代码3

    ruby测试代码4

    总之,"ruby测试代码4"这个主题涵盖了Ruby语言的测试实践,包括使用RSpec或Minitest编写测试用例,使用数据文件进行数据驱动测试,以及如何利用覆盖率工具和持续集成服务来提升测试效率和代码质量。对于开发者来说,...

    ruby+selenium-webdriver测试--多个测试用例源代码

    本篇文章将深入探讨如何使用Ruby和Selenium-Webdriver进行多测试用例的编写。 首先,我们需要了解Ruby的基本语法和面向对象编程的概念。Ruby是一种简洁、动态的编程语言,其语法清晰,易于阅读。在测试领域,Ruby常...

    ruby代码ruby代码ruby代码ruby代码ruby代码ruby代码

    ruby代码ruby代码ruby代码ruby代码ruby代码ruby代码ruby代码ruby代码

    ruby测试代码2

    总之,"ruby测试代码2"涉及了Ruby中的测试实践,包括选择合适的测试框架,编写清晰的测试用例,以及使用数据文件来覆盖多种场景。通过有效的测试,开发者可以提高代码的可靠性,并减少bug的出现。

    Ruby入门教程中文PDF 附实例

    此外,Ruby的块(Block)和 Proc 对象让函数式编程变得简单,例如使用`each`方法遍历数组: ```ruby fruits = ["Apple", "Banana", "Cherry"] fruits.each { |fruit| puts fruit } ``` 元编程是Ruby的另一个强大特性...

    ruby测试代码5

    "ruby测试代码5"可能是一个关于Ruby编程的测试项目,可能包含了对特定功能或者模块的验证和调试。下面将详细讨论Ruby测试、代码组织结构以及与"Floor", "Weapon", "Rpg"相关的编程概念。 首先,测试在软件开发中至...

    ruby+selenium-webdriver测试--第一个例子源代码

    在这个“ruby+selenium-webdriver测试--第一个例子源代码”中,我们将探讨如何使用Ruby和Selenium-Webdriver实现自动化测试的初步步骤。 首先,我们需要安装必要的库。确保已经安装了Ruby,并通过RubyGems来安装...

    ruby+selenium-webdriver测试-测试用例源代码

    Ruby 和 Selenium-Webdriver 是一种强大的组合,用于自动化 Web 应用程序的测试。这篇博客主要探讨了如何利用这两种工具来编写测试用例,并提供了源代码示例。在这个压缩包中,我们有一个名为 "test002" 的文件,很...

    ruby测试代码8.rar

    标题 "ruby测试代码8.rar" 暗示这是一个与Ruby编程语言相关的测试代码集合,可能是为了验证特定功能或实现特定逻辑而编写的。这个压缩包可能包含若干个Ruby脚本文件,用于展示或执行测试场景。 描述中的内容 "ruby...

    Ruby on Rails入门经典代码

    Ruby on Rails,简称Rails,是基于Ruby语言的一个开源Web应用程序框架,它遵循MVC(Model-View-Controller)架构模式,旨在使Web开发过程更加高效、简洁。本压缩包中的"Ruby on Rails入门经典代码"提供了新手学习...

    ruby源代码 ruby源代码 ruby源代码 ruby源代码5

    Ruby源代码是实现这一语言的底层逻辑和功能的程序,通过阅读和分析Ruby源代码,我们可以深入理解其工作原理,这对于学习和优化Ruby应用程序至关重要。 Ruby的设计哲学是“程序员的生产力优先”,因此它的语法易于...

    ruby 资源(代码范例)

    6. **测试**:Rails强调TDD(测试驱动开发),提供了如RSpec和MiniTest等测试工具,确保代码的质量和稳定性。 在"Ruby Cookbook Source"中,你可能会找到关于以上概念的具体示例代码,帮助你理解如何在实际项目中...

    ruby+selenium-webdriver测试源代码003

    在本资源中,我们关注的是使用Ruby和Selenium-Webdriver进行自动化测试的源代码,具体为"test003"。Ruby是一种流行的、动态的、面向对象的编程语言,而Selenium-Webdriver则是一个强大的工具,允许我们对浏览器进行...

    ruby测试代码

    在Ruby编程语言中,测试代码是确保代码质量与功能正确性的重要组成部分。Ruby提供了一些强大的测试框架,如Test::Unit、MiniTest以及RSpec,它们帮助开发者编写可读性强、易于维护的测试用例。 Test::Unit是Ruby...

Global site tag (gtag.js) - Google Analytics