看到有人问读数字的代码,试着写了一个,比较不优雅

问题描述

/**Tochangethislicenseheader,chooseLicenseHeadersinProjectProperties.*Tochangethistemplatefile,chooseTools|Templates*andopenthetemplateintheeditor.*/packagetest;importjava.util.ArrayList;importjava.util.Collections;importjava.util.Iterator;importjava.util.LinkedHashMap;importjava.util.List;importjava.util.Map;/****@authorAdministrator*/publicclassNianShuZi{/***@paramargsthecommandlinearguments*/staticStringdigit2String(chardigit){Stringread;switch(digit){case'0':return"ling";case'1':return"yi";case'2':return"er";case'3':return"san";case'4':return"si";case'5':return"wu";case'6':return"liu";case'7':return"qi";case'8':return"ba";case'9':return"jiu";default:return"fu";}}publicstaticvoidmain(String[]args){Stringnumber="-11111";//数字必须介于-10^8与10^8之间并不包括二者//Stringnumber=arg[0];if((number.contains("-")&&number.length()>9)||number.length()>8){System.out.println("数字超出范围!");return;}Stringf="";if(number.contains("-")){number=number.substring(1);f="fu";}char[]numbers=number.toCharArray();char[]Digits=newchar[numbers.length];intj=0;for(inti=numbers.length-1;i>=0;i--){Digits[j]=numbers[i];j++;}StringRead[]=newString[numbers.length];booleanzeroFlag=true;for(inti=0;i<Digits.length;i++){if(i==0||i==4){if(Digits[i]!='0'){Read[i]=digit2String(Digits[i]);}else{zeroFlag=false;}}else{if(Digits[i]=='0'){if(zeroFlag==true){Read[i]=digit2String(Digits[i]);zeroFlag=false;}}else{Read[i]=digit2String(Digits[i]);zeroFlag=true;}}}Map<Integer,String>m=newLinkedHashMap<Integer,String>();Map<Integer,String>wm=newLinkedHashMap<Integer,String>();for(inti=0;i<Read.length;i++){if(Read[i]!=null){if(i<4){m.put(i,Read[i]);}else{wm.put(i%4,Read[i]);}}}Strings=toMankind(m);StringBuildersb=newStringBuilder();if(!wm.isEmpty()){Stringws=toMankind(wm)+"wan";List<String>wes=newArrayList<String>();for(Integeri:wm.keySet()){wes.add(wm.get(i));}Collections.reverse(wes);Iteratorit=wes.iterator();while(it.hasNext()){sb.append("");sb.append(it.next());}sb.append("wan");}List<String>mes=newArrayList<String>();for(Integeri:m.keySet()){mes.add(m.get(i));}Collections.reverse(mes);Iteratoritm=mes.iterator();while(itm.hasNext()){sb.append("");sb.append(itm.next());}System.out.println(f+""+sb.toString().trim());}staticStringtoMankind(Map<Integer,String>m){intlog=0;for(Integeri:m.keySet()){log++;if(!m.get(i).equals("ling")){if(i==1){m.put(i,(m.get(i).equals("yi")&&log==m.size())?"shi":m.get(i)+"shi");}elseif(i==2){m.put(i,m.get(i)+"bai");}elseif(i==3){m.put(i,m.get(i)+"qian");}}}returnm.toString();}}

运行结果:fuyiwanyiqianyibaiyishiyi

解决方案

本帖最后由 skyhitnow 于 2015-01-09 16:02:10 编辑
解决方案二:
我还以为是可以发声的那种
解决方案三:
String[11]chinese={"ling","yi",...,"shi","fu"};Strings="-12345";char[]carr=s.toCharArray();for(charc:carr){//判断是否是负号,是的话用chinese[10],不是的话直接作为下标取chinese数组值使用}
解决方案四:
引用2楼u012171905的回复:

String[11]chinese={"ling","yi",...,"shi","fu"};Strings="-12345";char[]carr=s.toCharArray();for(charc:carr){//判断是否是负号,是的话用chinese[10],不是的话直接作为下标取chinese数组值使用}

没考虑位数,脑补失败
解决方案五:
基本算法已定,发声读出来也不难
解决方案六:
String[11]chinese={"ling","yi",...,"shi","fu"};String[4]weishu={"wan","qian","bai","shi"};Strings="-12345";char[]carr=s.toCharArray();for(inti=0;i<carr.length;i++){System.out.println(digitToCn(carr[i])+weishu[i]);}大致示意如此:)
解决方案七:
谁写一个正确而优雅的,分给谁~(我的结果是正确的)注意是人类读法:比如1000读作yiqian而不是yiqianlingbailingshiling还有好多条件自己想吧
解决方案八:
在10年前的时候,当时用vc开发一个语音导航的项目,那时候不像现在有各种tts组件可以实现。播报文字tts就是这么合成的,把0-10,百、千、万、元、等先录好音编辑成一个一个文件,然后一个一个拼出来的。

时间: 2024-08-01 12:06:33

看到有人问读数字的代码,试着写了一个,比较不优雅的相关文章

java读文件后的数据怎么写到一个数组中 数据格式如下

问题描述 java读文件后的数据怎么写到一个数组中 数据格式如下 解决方案 简单的写了一下,希望对你有帮助: public class Test { // 数组列数 private static final int COLUMN_COUNT = 3; public static void main(String[] args) { BufferedReader br = null; try { br = new BufferedReader(new InputStreamReader(new F

java代码-初学android写的一个通过线程实现“幸运8”的游戏遇到个问题

问题描述 初学android写的一个通过线程实现"幸运8"的游戏遇到个问题 刚刚开始学习android程序的开发,参照教材自行写了一个"幸运8"的游戏,可一运行手机就会弹出"幸运8已停止运行"的提示,请各位大神教教小弟代码哪里出错了···感激万分 package com.luck8; import com.luck8.R; import android.app.Activity; import android.os.Bundle; import

自己试着写了一个检测邮件的程序,但是无法和服务器连接。那位专家帮忙看一下,代码如下

问题描述 程序可以运行但是连不上服务器,编译时不报错#include"StdAfx.h"#include".pop3.h"#include"MAPI.h"#defineCONNECTION_CHECK1#defineUSER_CHECK2#definePASSWORD_CHECK3#defineSTAT_CHECK4POP3::POP3(void):m_nNum(0),m_strErr(_T("")){m_Server.Cre

不懂Ruby的程序员,如何快速读懂Ruby代码

本问答的目标读者是不了解Ruby语言.但有别的编程语言经验的人. Ruby语言的代码可读性是很强的.本问答只把一些语法特点.以及别的语言中可能没有或不同的东西展现出来,目的在于让有别的编程语言经验的人能快速读懂Ruby代码. 注意本问答讲的是Ruby语言本身(基于版本1.9),而不是Ruby on Rails,后者是Ruby的一种DSL,语言面貌上和Ruby有一定差异.   Q:Ruby最有特点的语法形式是什么? 或许是方法后接代码块的大量使用,以下面这行代码为例: file.each_line

写让别人能读懂的代码

随着软件行业的不断发展,历史遗留的程序越来越多,代码的维护成本越来越大,甚至大于开发成本.而新功能的开发又常常依赖于旧代码,阅读旧代码所花费的时间几乎要大于写新功能的代码. 我前几天看了一本书,书中有这么一句话: "复杂的代码往往都是新手所写,只有经验老道的高手才能写出简单,富有表现力的代码" 此话虽然说的有点夸张,可是也说明了经验的重要性. 我们所写的代码除了让机器执行外,还需要别人来阅读.所以我们要写: 让别人能读懂的代码 可扩展的代码 可测试的代码(代码应该具备可测试性,对没有可

手把手,74行代码实现手写数字识别

1. 引言:不要站在岸上学游泳 "机器学习"是一个很实践的过程.就像刚开始学游泳,你在只在岸上比划一堆规定动作还不如先跳到水里熟悉水性学习来得快.以我们学习"机器学习"的经验来看,很多高大上的概念刚开始不懂也没关系,先写个东西来跑跑,有个感觉了之后再学习那些概念和理论就快多了.如果别人已经做好了轮子,直接拿过来用则更快.因此,本文直接用Michael Nielsen先生的代码(github地址: https://github.com/mnielsen/neural-

java实现的简单猜数字游戏代码_java

本文实例讲述了java实现的简单猜数字游戏代码.分享给大家供大家参考. 具体代码如下: 复制代码 代码如下: import java.util.InputMismatchException; import java.util.Scanner; public class Main {         public static void main(String[] args) {                 // 产生一个随机数                 int number = (in

图形数字验证代码_php基础

图形数字验证代码 Code:   <? /* * Filename: authpage.php */ srand((double)microtime()*1000000); //验证用户输入是否和验证码一致 if(isset($_POST['authinput'])) { if(strcmp($_POST['authnum'],$_POST['authinput'])==0) echo "验证成功!"; else echo "验证失败!"; } //生成新的四

写了个读文件的代码,但运行之后读出来的就乱了

问题描述 写了个读文件的代码,但运行之后读出来的就乱了 这是代码void Read()//从文件中读取{ int ij; FILE *fp; fp=fopen(""busline.txt""r+""); if(fp==NULL) { printf(""不能打开此文件!""); exit(0); } for(i=0;i<m;i++) { fscanf(fp%d""&bl[i]