A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

本帖最后由 rehan 于 2015-2-11 18:05 编辑
  1. import java.io.*;
  2. public class Test3
  3. {
  4.         public static void main(String[] args) throws IOException        
  5.         {
  6.                 System.out.println("请输入一串正整数数字:");
  7.                 //读取键盘输入并调用readLine()方法
  8.                 BufferedReader br=new BufferedReader(new InputStreamReader(System.in));
  9.                 String str=br.readLine();
  10.                 changeMethod(str);
  11.                 br.close();
  12.         }
  13.         
  14.         //定义一个可以将字符串转换成中文输出的方法
  15.         public static void changeMethod(String str) throws IOException        
  16.         {        
  17.                 String[] arr={"零 ","一","二","三","四","五","六","七","八","九"};
  18.                 //定义一个缓冲区以提高效率
  19.                 StringBuilder sb=new StringBuilder();
  20.                
  21.                 //通过for循环遍历字符串中各个元素,并转换成相应的中文
  22.         for (int i = 0; i < str.length(); i++)
  23.         {                          
  24.                 int x= str.charAt(i)-'0';
  25.                 //判断是否超出范围,对符合要求数据添加进缓冲区
  26.             if(x>=0 && x<10)
  27.             {
  28.                     sb.append((arr[x]));
  29.             }
  30.             else
  31.             {
  32.                 System.out.print("超出范围,请重新输入:");
  33.             }                       
  34.         }
  35.         //最后将缓冲区的数据变成字符串打印在控制台上
  36.         System.out.println(sb.toString());
  37.         }
  38. }
复制代码
我一直搞不懂的就是这句话:int x= str.charAt(i)-'0';还有它下面的if,else究竟有什么用处?而且它还不能防止我输入负数啊?我照样可以输入负数,另外为什么char类型的返回值 -‘0’就变int形了???

17 个回复

正序浏览
我笔试的时候就有这道题,我当时用的是scanner    也做出来了 ,但是很明显没有这么清楚,真心受教了
回复 使用道具 举报
huangchunwei 来自手机 中级黑马 2015-2-12 00:51:40
17#
int x= str.charAt(i)-'0';
这句用了1.5的新特性,自动装箱。而这个转换成中文,用的是查表法。输入的正整数数字是和表中的值一一对应的。
回复 使用道具 举报
huangchunwei 来自手机 中级黑马 2015-2-12 00:41:29
16#
学习了。。。:):):)
回复 使用道具 举报
rehan 发表于 2015-2-11 22:14
嗯,加油↖(^ω^)↗,话说你是第几期的?

我还没定下来看看情况吧,流程就差面试了,不过我想等毕业答辩完事再去,省着来回跑,耽误课程还累
回复 使用道具 举报
你是输入完之后没有判断负数就直接调用了changeMethod()方法,当然就是没有限制你对负数的输入啊。
你要不想输入负数可以定义一个循环保证输入的没有负数
回复 使用道具 举报
Gonnaloveu 发表于 2015-2-11 21:52
恩,不过这是我想的,不一定对...切记切记,我最怕误导人了...  
0~9不是1~9,有可能是你想对了说错了 =.= ...

恩。。说错了。。不过理解了。真心感谢
回复 使用道具 举报
rehan 中级黑马 2015-2-11 22:14:15
12#
Gonnaloveu 发表于 2015-2-11 21:56
共同进步..我也是才学不久..大学玩了四年..唉,不过过去的事既然没法挽回了就从现在好好做吧 ...

嗯,加油↖(^ω^)↗,话说你是第几期的?
回复 使用道具 举报
二楼的那位同学解答的很详细哈!
回复 使用道具 举报
rehan 发表于 2015-2-11 21:27
另外如果使用Scanner方法的话会怎么样?

Scanner是类不是方法..具体可以看API
回复 使用道具 举报
rehan 发表于 2015-2-11 21:34
真心感谢你这么详细认真的回答!!!看懂了。。。

共同进步..我也是才学不久..大学玩了四年..唉,不过过去的事既然没法挽回了就从现在好好做吧
回复 使用道具 举报
konglingzhiyu 发表于 2015-2-11 20:39
认真看完楼上的讲解。学习了。也就是说char类型'1','2'.'3'.......与‘0’加减所得的数转换成int后正好是in ...

恩,不过这是我想的,不一定对...切记切记,我最怕误导人了...  
0~9不是1~9,有可能是你想对了说错了 =.=
回复 使用道具 举报
rehan 中级黑马 2015-2-11 21:34:20
7#
Gonnaloveu 发表于 2015-2-11 19:31
没人答..还是我来吧,我不是什么大神
太多了我们慢慢来:
int x= str.charAt(i)-'0';  因为右边用了算术运算 ...

真心感谢你这么详细认真的回答!!!看懂了。。。
回复 使用道具 举报
另外如果使用Scanner方法的话会怎么样?
回复 使用道具 举报
认真看完楼上的讲解。学习了。也就是说char类型'1','2'.'3'.......与‘0’加减所得的数转换成int后正好是int型的1-9.而下面的范围判断是防止输入键盘上的其他键。不知道我理解的对不对!!!
回复 使用道具 举报
没人答..还是我来吧,我不是什么大神
太多了我们慢慢来:
int x= str.charAt(i)-'0';  因为右边用了算术运算符 - ,所以右边就是int类型的了,我们假设str = "6579"  i=0
这句话的性质就是 int x = '6'-'0';  右边是两个字符在相减,做运算的实际是他们的阿斯克码 也就是int x=54 - 48

它下面的if,else究竟有什么用处?
看注释啊..写的很清楚了  //判断是否超出范围,对符合要求数据添加进缓冲区
也就是看x 是否在0~9之间

它还不能防止我输入负数啊?我照样可以输入负数,
他是一个字符一个字符检验的,没写判断是否是正负数的语句 当然防止不了

另外为什么char类型的返回值 -‘0’就变int形了???
参照第一个回答

int x= str.charAt(i),这句话也没有提示错误也就是这样直接可以强转?不应该是:char x=str.charAt(i)吗?

这个我不太确定,如果有明白的人你可以问一下,我想的有可能是错的:

一个类型转换成另一种类型,实际上只是改变了显示形式,每个类型都是按照自己的码表显示对应的内容,比如上面提到的 54 在int中对应的内容就是54 所以int i=54 的话 i就等于54 如果char c=54 的话 c就等于'6'  如果两个类型码表的大小不一样 大的不能转小的 小的可以转大的,(实际上char的码表范围比int 小) 你也许会想既然char比int 小为什么 char c = 54;还可以, 其实是因为54是已知数,而且是常量,也就是已经知道是要找char 表中的54对应的内容你如果写成超过表的数如99999999  或者变成变化范围比他大的变量如: int i=54; char c = i; 就都不行了,打这么些字累死了....:L
回复 使用道具 举报 1 0
求各位大神解决小弟疑惑。。。。
回复 使用道具 举报
另外,试了一下,int x= str.charAt(i),这句话也没有提示错误,也就是这样直接可以强转?不应该是:char x=str.charAt(i)吗?
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马