[TL]关于数字转换大写汉字的一点困惑

20 views
Skip to first unread message

kid

unread,
Aug 16, 2009, 11:29:38 AM8/16/09
to pon...@googlegroups.com
比如:
321===>叁佰贰拾壹

但是:
301===>叁佰零壹,而不是叁佰壹

推广之:
20000000000001===>贰拾万亿零壹

我的思路:
比如3011,我先把它转换成3千1拾1(为了直观些,我就不写成叁仟壹拾壹),然后判断左右相邻的单位级差是否>1,‘千’和‘拾‘之间差个‘佰’,所以自动填零,得出===>3千零1拾1

上述思路遇到的问题:
比如20000009===>应该是2千万零9,按照我的思路的话,就变成2千零9,打了一个小补丁之后,变成2千万零9,虽然是对的,但是遇到一些比较变态的数字,还是不对,得打一些补丁,我觉得肯定有很完美的解决方案,只是我没想到而已......

所以,想和大家讨论一下,不知大家有何高见?这个问题说白了就是:把一串数字,转换成白话文形式,比如10200===>1万零2佰,而不是1万2佰

谢谢大家!

Shuo Chen

unread,
Aug 16, 2009, 11:42:55 AM8/16/09
to TopLanguage
我记得这是小学数学课本上教过的,用中文读出整数时按4位分节,以"个"、"万"、"亿"、"万亿"为节的单位。
要不你找本小学课本看看?

kid

unread,
Aug 16, 2009, 11:55:05 AM8/16/09
to pon...@googlegroups.com
1,我就是想加个’零‘,比如301===>3佰零1
2,我学习不好,见笑了~~~小学课本就免了,呵呵

2009/8/16 Shuo Chen <gian...@gmail.com>

trydofor

unread,
Aug 16, 2009, 2:20:14 PM8/16/09
to pon...@googlegroups.com
漫漫长夜,无心睡眠.

YY成两歩.
1. 分出单位(拾,佰,仟,万,十万,百万,千万,亿,十亿,百亿,千亿,万亿)和数字.
2. (零+单位)*n 变成 "零"


--
http://trydofor.com - Simplicity is everything.

kid

unread,
Aug 16, 2009, 7:34:43 PM8/16/09
to pon...@googlegroups.com
to tyrdofor:
你这个方法遇到亿亿的情况,就不对了,比如1亿亿,你的转换就成了1亿 
这个问题看似简单,但是要考虑的情况比较多

谢谢trydofor,many thanks!

2009/8/17 trydofor <tryd...@gmail.com>

Devymex

unread,
Aug 16, 2009, 11:56:13 AM8/16/09
to pon...@googlegroups.com
你说的都对啊,把不对的例子发上来。

在CSDN有很齐全的数字转汉字代码,C++、JAVA、C#、ASP、PHP,应有尽有

2009/8/16 Shuo Chen <gian...@gmail.com>

Devymex

unread,
Aug 16, 2009, 11:57:33 AM8/16/09
to pon...@googlegroups.com

ts

unread,
Aug 16, 2009, 12:07:46 PM8/16/09
to pon...@googlegroups.com
以前用icu实现过从 汉字数字 到 阿拉伯数字的转换,很方便,反过来没试过,楼主有兴趣试试看么?

2009/8/17 kid <kid...@gmail.com>

Shuo Chen

unread,
Aug 16, 2009, 8:11:47 PM8/16/09
to TopLanguage
何必舍近求远呢?小学二三年级的数学课本就能解决你的疑惑。

九年义务教育全日制小学数学教学大纲(修订版)
http://math.cersp.com/CourseStandard/CEDU/200509/406.html

二 年 级

教学内容
(2)万以内数的读法和写法。
数数。百位、千位、万位。数的读法、写法和大小比较。

教学要求
2.认识计数单位"百"、"千"和"万",知道相邻两个计数单位之间的十进关系。掌握万以内的数位顺序,会读数、写数,会比较数的大小。


三 年 级

教学内容
(1)亿以内数的读法和写法。
计数单位"十万"、"百万"、"千万"。相邻计数单位间的十进关系。亿以内的数的读法和写法。数的大小比较。以万作单位的近似数。

教学要求
1.认识计数单位"十万"、"百万"、"千万",初步掌握十进制计数法。会根据数级读、写亿以内的数。会根据要求把一个数用四舍五入法省略尾数,写出近
似数。

On Aug 16, 11:55 pm, kid <kid....@gmail.com> wrote:
> 1,我就是想加个'零',比如301===>3佰零12,我学习不好,见笑了~~~小学课本就免了,呵呵
>
> 2009/8/16 Shuo Chen <giantc...@gmail.com>

realfun

unread,
Aug 16, 2009, 10:08:31 PM8/16/09
to pon...@googlegroups.com
http://fayaa.com/code/view/37/



--
代码发芽网: http://fayaa.com/code/ (无需插件支持blog代码高亮,100+种语言,30+种高亮主题)
游戏发芽网: http://fayaa.com/youxi/ (华容道、数独等在线游戏及求解、图解)
我的Blog: 半瓶墨水(http://www.2maomao.com/blog)
Follow me @ http://twitter.com/realfun

trydofor

unread,
Aug 16, 2009, 10:34:05 PM8/16/09
to pon...@googlegroups.com
"亿亿",单位而已,有区别么?
把有歧义的单位,按无歧义的序列排序.
"亿亿亿亿","亿亿","亿".
或者使用单位文字的最大匹配.

只要区分出单位或数字就没问题了吧.

kid wrote:
> to tyrdofor:
> 你这个方法遇到亿亿的情况,就不对了,比如1亿亿,你的转换就成了1亿
> 这个问题看似简单,但是要考虑的情况比较多
>
> 谢谢trydofor,many thanks!
>

> 2009/8/17 trydofor <tryd...@gmail.com <mailto:tryd...@gmail.com>>


>
>
> 漫漫长夜,无心睡眠.
>
> YY成两歩.
> 1. 分出单位(拾,佰,仟,万,十万,百万,千万,亿,十亿,百亿,千亿,万亿)和数字.
> 2. (零+单位)*n 变成 "零"
>

kid

unread,
Aug 17, 2009, 12:03:55 AM8/17/09
to pon...@googlegroups.com
to trydofor:
比如:
1 0000 0000 0000 0000

2009/8/17 trydofor <tryd...@gmail.com>

kid

unread,
Aug 17, 2009, 12:13:58 AM8/17/09
to pon...@googlegroups.com
to realfun:
多谢!就是这个效果!
101010101=>'一亿零一百零一万零一百零一'
11111111111234567'=>一亿一千一百一十一万一千一百一十一亿一千一百二十三万四千五百六十七'

trydofor

unread,
Aug 17, 2009, 2:54:05 AM8/17/09
to pon...@googlegroups.com
恩,google一下,又顺连接不了下小学课本,完全不知道这东西怎么回事.

原以为是这样
拾 = 10^1
百 = 10^2
千 = 10^3

萬 = 10^4
億 = 10^8
兆 = 10^12 = "万亿"
京 = 10^16 = "亿亿"
垓 = 10^20 = "万亿亿".
杼 = 10^24 = "亿亿亿".
穰 = 10^28 = ... ...
溝 = 10^32
澗 = 10^36
正 = 10^40
載 = 10^44
極 = 10^48

结果:

11111111111234567 居然是这么迷糊的一种汉字组合啊.
一 亿
一千一百一十一 万
一千一百一十一 亿
一千一百二十三 万
四千五百六十七

8个一组,4个一段.无止境.

kid wrote:
> to trydofor:
> 比如:
> 1 0000 0000 0000 0000
>

> 2009/8/17 trydofor <tryd...@gmail.com <mailto:tryd...@gmail.com>>


>
>
> "亿亿",单位而已,有区别么?
> 把有歧义的单位,按无歧义的序列排序.
> "亿亿亿亿","亿亿","亿".
> 或者使用单位文字的最大匹配.
>
> 只要区分出单位或数字就没问题了吧.
>

kid

unread,
Aug 17, 2009, 4:02:36 AM8/17/09
to pon...@googlegroups.com
to trydofor:
让我看小学课本的同学没有理解我的意思,这个问题看似简单,但是需要考虑的问题比较多

realfun同学给的链接挺靠谱的==>http://fayaa.com/code/view/37/

2009/8/17 trydofor <tryd...@gmail.com>
恩,google一下,又顺连接不了下小学课本,完全不知道这东西怎么回事.

Galaxy

unread,
Aug 17, 2009, 7:17:26 AM8/17/09
to pon...@googlegroups.com
一亿亿以上的估计这样读出来也没几个人能反应过来,这种情况下,感觉直接换科学计数法会显得更智能些。

当然,UI设计还是要看客户需求……

2009/8/17 kid <kid...@gmail.com>:

Bill Wung

unread,
Aug 18, 2009, 8:41:34 AM8/18/09
to pon...@googlegroups.com
汉语表示数字的精髓在于,不容易被人随便修改,就好象中国的银行和支票都需要写上汉语数字,保证不易修改。
阿拉伯数字的整数,加个点就成小数了

2009/8/17 Galaxy <gala...@gmail.com>:

--
笑骂由人,洒脱自如!
心若冰清,天塌不惊!
http://www.iron-feet.cn

kid

unread,
Aug 18, 2009, 11:56:05 AM8/18/09
to pon...@googlegroups.com
有道理~~~
2009/8/18 Bill Wung <iron.feet...@gmail.com>

Jay True

unread,
Aug 18, 2009, 8:18:57 PM8/18/09
to pon...@googlegroups.com
还要是繁体啊,或者说大写(?)

2009/8/18 kid <kid...@gmail.com>



--
歌词唱清楚,不是周杰伦
Home Page: http://glacjay.is-a-geek.org/blog/

kid

unread,
Aug 18, 2009, 10:28:34 PM8/18/09
to pon...@googlegroups.com
to Jay True:
大写,壹贰叁......

2009/8/19 Jay True <gla...@gmail.com>
还要是繁体啊,或者说大写(?)

ppizzq

unread,
Aug 18, 2009, 9:52:07 AM8/18/09
to TopLanguage
我在H公司有一次做过这个题,并且通过了所有的测试用例,原题规定最大数字不会超过12位(应该是千亿),我记得当时的解决思路是这样的

拿一个 21200101来举例,

1. 把传入的数字补齐12位,前面补0, 000021200101
2. 把数字按四位一段拆开。例如0000 2120 0101
3. 设计一个函数能够得出四位数字的汉字大写。 这个相对简单,可以逐位判断,

int x = 0;
if(a[0] > '0') //千位
{
输出 X 仟
x = a[0] - '0';
}

if(a[1] == '0') //百位
{
if(x >= 0) //如果千位非0则输出,千位也是0就不输出了
{
输出 零
}
}
else
{
输出 X佰
x = x* 10 + a[1];
}

if(a[2] == '0')
{
if(x >= 0 && a[1] != '0') //两千两百零xxx, 但避免 2001这种情况
{
输出 零
}
}
else
{
输出 X 拾
x = x * 10 + a[2]
}

if(a[3] > '0')
{
输出 X
}


4. 然后每段调用上面的输出加上“亿”“万”或者“零”
if(n1 > 0) //n1为以亿为单位的数字
{
输出N1 亿// N1为n1对应的调用上面函数输出的汉字

}


if (n1 > 0 && ( (n2 > 0 && n2 < 1000) || (n2 == 0 && n3 >0)) //万位
输出零的条件
)
{
输出 零
}

if(n2 > 0)
{
输出N2 万
}

if(n3 < 1000 && n2 > 0)
{
输出 零
}

if(n3 > 0)
{
输出N3
}

if( n1 + n2 + n3 == 0)
{
输出 零
}


大概的思路就是如上这样的, 有些细节时间长忘了, 我感觉这方法有一点笨拙,但应该能解决问题。

从这道题我当时得出一个结论,就是把实际问题转换为逻辑步骤的能力是需要长时间锻炼的。面对任何一个数字,绝大多数人(不管会不会写程序)都能读正
确,不信找个小学生或者卖菜的大妈试试,但让他总结出规则来,缺很少有人能全部总结对。 为什么?呵呵

Galaxy

unread,
Aug 19, 2009, 12:33:21 AM8/19/09
to pon...@googlegroups.com
原因就在于人脑和电脑的区别。现有编程语言是能模拟神经网络结构,但这种小问题也用NN处理就显得不好看。而且预先设定节点结构本身就很麻烦。
谁有兴趣用NN解下?

2009/8/18 ppizzq <ppi...@gmail.com>:


> 我在H公司有一次做过这个题,并且通过了所有的测试用例,原题规定最大数字不会超过12位(应该是千亿),我记得当时的解决思路是这样的
>
>

Kenny Yuan

unread,
Aug 19, 2009, 2:43:43 AM8/19/09
to pon...@googlegroups.com
Standard prefixes for the SI units of measure
Multiples Name
deca- hecto- kilo- mega- giga- tera- peta- exa- zetta- yotta-
Symbol
da h k M G T P E Z Y
Factor 100 101 102 103 106 109 1012 1015 1018 1021 1024
 
Subdivisions Name
deci- centi- milli- micro- nano- pico- femto- atto- zepto- yocto-
Symbol
d c m µ n p f a z y
Factor 100 10−1 10−2 10−3 10−6 10−9 10−12 10−15 10−18 10−21 10−24

转一个SI的来对照一下!

2009/8/17 trydofor <tryd...@gmail.com>

拾 = 10^1
百 = 10^2
千 = 10^3

萬 = 10^4
億 = 10^8
兆 = 10^12 = "万亿"
京 = 10^16 = "亿亿"
垓 = 10^20 = "万亿亿".
杼 = 10^24 = "亿亿亿".
穰 = 10^28 = ... ...
溝 = 10^32
澗 = 10^36
正 = 10^40
載 = 10^44
極 = 10^48



--
Kenny Yuan
C++, UI, LISP, MMA, Psychology and Automobile.
BLOG: CS巴别塔(Computer Science Babel)
URL1: http://csbabel.wordpress.com/
URL2: http://blog.csdn.net/yuankaining/
Reply all
Reply to author
Forward
0 new messages