阿拉伯数转中文与英文

  • 前言
  • 一、阿拉伯数字转换
    • 1、阿拉伯数字转中文
      • a、案例
      • b、解决方案
    • 2、阿拉伯数转英文
      • a、案例
      • b、解决方案
  • 总结
  • 参考文献

前言

如果思考算法的解法方案是一种模拟,那么这一般不是个好的解决方案。对于一个复杂的问题,挖掘其中的规律,把问题抽象处理统一解决,这样代码才会简洁清晰。

一、阿拉伯数字转换

1、阿拉伯数字转中文

a、案例

b、解决方案

将数字分解成三部分,亿 & 万 & 无单位,通过for循环分片出来即可,三部分处理方式是一样的,唯一不同的就是最后的单位添加。
而对于每一部分,具体的处理方式一样,分成个十百千四个级别,所有用一个函数统一处理即可。
注:需要注意到细节,
1.只有一种前导为零的情况要特殊处理;
2.每部分末尾不能为0
3.多个零只能写一个
4.有零的时候表不表达出来要根据前面是否为0

import java.util.*;public class Solution {/*** 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可*** @param n int整型* @return string字符串*/public String num2cn (int n) {// 唯一一个前导可以为零!if (n == 0) return "零";// 统一为正数处理。boolean isNeg = n < 0;n = Math.abs(n);// 把规律抽象出来,// 将这个数字分成三部分,亿 & 万 & 无单位// 每一部分,末尾是不能以0结尾的;多个零只能用一个零表示。StringBuilder sb = new StringBuilder();for (int i = 2, unit = (int)1e8; i >= 0; i--, unit /= 1e4) {int part = n / unit;if (part != 0) {sb.append(toChinese(part)).append(units[i]);n %= unit;}}String rs = sb.toString();// 特殊情况,一十开头变成十。if ("一十".equals(rs.substring(0, 2))) rs = rs.substring(1);// 前缀是否为负,要加上。if (isNeg) rs = "负" + rs;return rs;}boolean preIsZero = true;// 只要前面有非零数,那么零就需要表达出来。public String toChinese(int num) {StringBuilder sb = new StringBuilder();// 分成四个部分处理,千 & 百 & 十 & 个位for (int i = 3, unit = (int)1e3; i >= 0; i--, unit /= 10) {int cur = num / unit;if (cur != 0) {sb.append(chinese[cur]).append(base[i]);preIsZero = false;} else if (!preIsZero) {sb.append(chinese[cur]);preIsZero = true;}num %= unit;}// 每一部分,都不能以零结尾。if ("零".equals(sb.substring(sb.length() - 1))) {// 如果为零,还得更改preIsZero,设置为false,毕竟把零给去了。preIsZero = false;sb.deleteCharAt(sb.length() - 1);}return sb.toString();}static String[] chinese =new String[] {"零", "一", "二", "三", "四", "五", "六", "七", "八", "九"};static String[] base = new String[] {"", "十", "百", "千"};static String[] units = new String[] {"", "万", "亿"};
}

2、阿拉伯数转英文

a、案例

b、解决方案

同样采用抽象统一的思想,规律也很容易发现,每三个数分为一趴,单位分别为Billion Million Thousand 无单位。
注:和中文不同的时,十几和其他两位数的处理方式。

class Solution {// num的范围从0-20亿。// 数字转英文,不同于中文,// 右到左每三位一组划分,Millon,Thousand,结尾,3位用一个函数获取转换后的结果,当作最低三位。public String numberToWords(int num) {if(num == 0) return "Zero";StringBuilder sb = new StringBuilder();for(int i = 3,unit = (int)1e9;i >= 0;i--,unit /= (int)1e3){int cur = num / unit;if(cur != 0){sb.append(toEnglish(cur)).append(thousands[i]).append(' ');num %= unit;}}return sb.toString().trim();}public String toEnglish(int num){StringBuilder sb = new StringBuilder();int i = num / 100;if(i != 0) sb.append(singles[i]).append(" Hundred ");num %= 100;i = num / 10;if(i > 1) {sb.append(tens[i]).append(' ');num %= 10;}if(num == 0) return sb.toString();if(num < 10) sb.append(singles[num]).append(' ');else sb.append(teens[num % 10]).append(' ');return sb.toString();}String[] singles = {"", "One", "Two", "Three", "Four", "Five", "Six", "Seven", "Eight", "Nine"};String[] teens = {"Ten", "Eleven", "Twelve", "Thirteen", "Fourteen", "Fifteen", "Sixteen", "Seventeen", "Eighteen", "Nineteen"};String[] tens = {"", "Ten", "Twenty", "Thirty", "Forty", "Fifty", "Sixty", "Seventy", "Eighty", "Ninety"};String[] thousands = {"", "Thousand", "Million", "Billion"};
}

总结

1)模拟不是算法,算法需要抽象问题,让问题有统一简洁的处理方式,抓住规律才能让问题简单起来。
2)善用数据结构,善用空间存储,降低时间复杂度,比如常用的数组,是一个很好用的数组hash。

参考文献

[1] LeetCode 阿拉伯数转中文
[2] LeetCode 阿拉伯数转英文

阿拉伯数转中文与英文[找到规律,抽象问题,转换成代码]相关推荐

  1. python数字转换成中文大写_python初学者笔记(2):阿拉伯数字转换成中文大写

    题:输入一个数字,转换成中文大写的写法 可运行的程序(Python 2.7.9): 1 #-*- coding: utf-8 -*- #在python2的py文件里面写中文,必须要添加一行声明文件编码 ...

  2. mysql 16进制字符串转中文_mysql如何把16进制转换成中文字符显示

    匿名用户 1级 2012-07-06 回答 oracle的是这样的: Oracle数据库中向BLOB类型字段插入字符串并把插入的BLOB数据转换成字符串显示的方法 首先先在数据库中创建一张表 crea ...

  3. java中文句号转换英文句号_java实现中文或其他语言及标点符号等转换成unicode字符串,或unicode的16进制码转换回文字或符号等...

    packageorg.analysisitem20181016.test;public classCode128Test2019052201 {public static final String U ...

  4. NLP对数据集进行(词性标注):将所有的词性进行汇总并且编号;将所有的英文词对应的词性转换成编号,得到list

    我最近在做一个自然语言处理的作业,词性标注 首先对词性标注的数据集进行处理 直接上代码,我再解释一下 # -*- coding: utf-8 -*-import nltkdef trans_chaTo ...

  5. C语言-译密码。为使电文保密,往往按一定规律将其转换成密码,收报人再按约定的规律将其译回原文。

    例如,可以将以下规律将电文变成密码:将字母A变成字母E,a变成e,即变成其后的第4个字母,W变成A,X变成B,Y变成C,Z变成D.字母按上述规律转换,非字母字符保持原状不变,如"China! ...

  6. python把数字阿拉伯数字转换成中文10以内_Python实现把数字转换成中文

    #!/usr/bin/python #-*- encoding: utf-8 -*- import types class NotIntegerError(Exception): pass class ...

  7. unity 只输入中英数_UITextField只限中文、英文、数字输入和限制字符个数的实现方法...

    写在前面 一般情况下一个字母.符号.数字相当于一个字符,一个汉字相当于两个字符,一个emoji表情相当于两个或更多字符.本文要实现的是在UITextField只允许输入一定字符数的中文.英文和数字,不 ...

  8. jmeter切换到中文_Jmeter转换成中文模式

    本片文章转至:https://blog.csdn.net/him2014/article/details/79603887 下载安装好Jmeter后默认的是英文,对于我这种学渣来说简直就是受到了100 ...

  9. java如何将中文转换成byte数组

    作为一名程序员,有时候会在想,java是如何将一个中文字符,转化成一个byte数组,是如果从一个byte数组转化成字符的呢? 其实大家都知道utf-8英文占1个字节,中文占3个字节,GBK中文英文都占 ...

最新文章

  1. Failed to fetch http://mirrors.cloud.aliyuncs.com/
  2. 一起来开发Android的天气软件(一)——功能规格介绍
  3. java中什么是递归_java中什么是递归
  4. kv存储对抗关系型数据库
  5. PHP的静态变量和引用函数
  6. 驱动多个二相四线制步进电机的Proteus仿真
  7. 论文阅读:Siam-RPN
  8. 徐小凤将现身东方卫视跨年晚会 为63岁庆生
  9. 斐波那契数列——java实现
  10. 锐浪报表 Grid++Report uniGUI Web表格打印
  11. 计算机毕业论文初稿,毕业论文初稿一般写多久
  12. 安装chrome插件:FireShot
  13. 三星 android 调试模式设置,三星galaxy s4 usb调试在哪里 s4 usb调试模式设置方法详解...
  14. 四、子弹类的创建,飞机子弹发射与无用子弹的销毁(雷霆战机)
  15. 如何开通微信商城?微商城的开通方法?
  16. 凯撒密码解密加密(C语言)
  17. 游戏封网卡mac地址后修改网卡mac地址
  18. 设计一个类代表二维空间的一个点,设计一个类代表二维空间的一个圆。要求两个成员变量。一个是圆心,一 个是半径,提供计算面积的方法。为上述Cricle类添加一个方法,计算一个点(Point)是否在圆内
  19. Excel转PDF基于Microsoft.Office.Interop.Excel
  20. 控制器(Controller)规范

热门文章

  1. 流体力学-----动量方程的推导和理解---NS方程
  2. 东文财 赵栋 罗松 201771010106《面向对象程序设计(java)》实验14
  3. 建模师能干到多少岁?
  4. 建模师的前景怎么样?
  5. 自动气象站解决方案 案例分享
  6. 学术顶会再突破!计算平台 MaxCompute 论文入选国际顶会VLDB 2021
  7. GD32F4—RTC闹钟及自动唤醒中断配置详解
  8. 通过数组指针给二维数组赋值
  9. 软件工程基础个人项目——数独(5)
  10. has been blocked by CORS policy: Response to preflight request doesn‘t pass access control check