这个类的最初版本曾经发在我的另一个博客:

http://www.cnblogs.com/codejar/archive/2012/02/15/2352606.html

这里贴的是refactor后的最新版,新版支持传入String类型的数字。

这里是一个示例程序及输出:

import java.util.Arrays;
import java.util.List;public class NumberTextTest {public static void main(String[] args) {List<String> numbers = Arrays.asList("1","123","123456789","101","1001","100000","1000300000250000004","205734908570001","1348900");NumberText nt = NumberText.getInstance(NumberText.Lang.ChineseSimplified);for(String number : numbers)System.out.println(nt.getText(number));System.out.println("---");nt = NumberText.getInstance(NumberText.Lang.English);for(String number : numbers)System.out.println(nt.getText(number));}
}

输出如下:

run:
一
一百二十三
一亿二千三百四十五万六千七百八十九
一百零一
一千零一
一十万
一百京零三百兆零二亿五千万零四
二百零五兆七千三百四十九亿零八百五十七万零一
一百三十四万八千九百
---
one
one hundred and twenty three
one hundred and twenty three million four hundred and fifty six thousand seven hundred and eighty nine
one hundred and one
one thousand and one
one hundred thousand
one quintillion three hundred trillion two hundred and fifty million and four
two hundred and five trillion seven hundred and thirty four billion nine hundred and eight million five hundred and seventy thousand and one
one million three hundred and fourty eight thousand nine hundred
BUILD SUCCESSFUL (total time: 0 seconds)

另外这个工具还支持中文大写:

NumberText.getInstance(NumberText.Lang.ChineseTraditional);

NumberText.java 的源代码如下:

/* * Copyright 2012 na.shi.wu.you (raistlic@gmail.com) * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */
import java.util.HashMap;
import java.util.Map;/*** This class transfers an integer number into a string :* * <br/>* * <pre>{@code* // an example :*   NumberText ns = NumberText.getInstance(NumberText.Lang.EnglishWithDash);*   ns.getText(123) // one hundred and twenty-three*   ns.getOrdinalText(320) // three hundred and twentieth* }</pre>* * @date   09/02/2012* @author na.shi.wu.you (raistlic@gmail.com)*/
public abstract class NumberText {/*----------------------------------------------------------------------------* not designed to be inherented outside this file* no public constructors provided, -- use factory method---------------------------------------------------------------------------*/private NumberText() {}/*** Exports a {@code NumberText} implementation instance, based on a natural * language argument. {@see Lang}* * @param lang* @return a NumberText instance.*/public static NumberText getInstance(Lang lang) {return lang.instance();}/*** Transfers an integer number into a String, specifically in which language * depends on the implementation.* <p />* e.g. in EnglishWithDash,* <p />*   100 -> one hundred* <br />*   -976083854 -> minus nine hundred and seventy-six million and eighty-three *                 thousand eight hundred and fifty-four* * @param number the integer number to be transfered* @return the result String*/public final String getText(long number) {return getText(Long.toString(number));}/*** Transfers an integer number into a String, specifically in which language * depends on the implementation.* <p />* e.g. in EnglishWithDash,* <p />*   100 -> one hundred* <br />*   -976083854 -> minus nine hundred and seventy-six million and eighty-three *                 thousand eight hundred and fifty-four* * @param number the integer number to be transfered* @return the result String*/public abstract String getText(String number);/*** Transfers an integer number into a String of its ordinal representation, * specifically in which language depends on the implementation.* <p />* e.g. in EnglishWithDash,* <p />*   100 -> one hundredth* <br />*   8331125 -> eight million three hundred and thirty-one thousand one *              hundred and twenty-fifth* * @param number the integer number to be transfered* @return the result String*/public final String getOrdinalText(long number) {return getOrdinalText(Long.toString(number));}/*** <p>* Transfers an integer number into a String of its ordinal representation, * specifically in which language depends on the implementation.* </p>* * <p>* e.g. in EnglishWithDash,* <br /><br />*   100 -> one hundredth* <br />*   8331125 -> eight million three hundred and thirty-one thousand one *              hundred and twenty-fifth* </p>* * @param number the integer number to be transfered* @return the result String*/public abstract String getOrdinalText(String number);/*** This enumeration type is typically named under a natural language * name, and is to mark a specific implementation name; it is used as an * argument to call the factory method * {@link NumberText#getInstance(NumberText.Lang)}.*/public static enum Lang {English              (NumberTextEnglishCleanSpaceOnly.INSTANCE),EnglishWithDash      (NumberTextEnglish.INSTANCE),ChineseSimplified    (NumberTextChinese.SIMPLIFIED),ChineseTraditional   (NumberTextChinese.TRADITIONAL),;private final NumberText instance;private Lang(NumberText instance) {this.instance = instance;}private NumberText instance() {if( instance == null )throw new UnsupportedOperationException("Language not supported yet : " + this);return instance;}}abstract int limit();void checkNumber(String number) {if( !number.matches("-?\\d+") )throw new NumberFormatException();int length = number.length();if( number.startsWith("-") )length --;if( length > limit() )throw new UnsupportedOperationException("The current " + NumberText.class.getSimpleName() +"can only handle numbers up to (+/-)10^" + limit() + ".");}/*----------------------------------------------------------------------------* EnglishWithDash Implementation---------------------------------------------------------------------------*/private static class NumberTextEnglish extends NumberText {private static final NumberText INSTANCE = new NumberTextEnglish();static enum Connect {Minus               ("minus"),Hundred             ("hundred"),And                 ("and"),AfterMinus          (" "),AfterNumber         (" "),AfterPower          (" "),AfterHundred        (" "),AfterAnd            (" "),AfterTen            ("-"),;final String display;Connect(String display) { this.display = display; }private static boolean isConnect(char c) {return c == ' ' || c == '-';}}static enum Power {Thousand          ("thousand"),          // 10 ^ 3Million           ("million"),           // 10 ^ 6Billion           ("billion"),           // 10 ^ 9Trillion          ("trillion"),          // 10 ^ 12Quadrillion       ("quadrillion"),       // 10 ^ 15Quintillion       ("quintillion"),       // 10 ^ 18 (enough for Long.MAX_VALUE)Sextillion        ("sextillion"),        // 10 ^ 21Septillion        ("septillion"),        // 10 ^ 24Octillion         ("octillion"),         // 10 ^ 27Nonillion         ("nonillion"),         // 10 ^ 30Decillion         ("decillion"),         // 10 ^ 33Undecillion       ("undecillion"),       // 10 ^ 36Duodecillion      ("duodecillion"),      // 10 ^ 39Tredecillion      ("tredecillion"),      // 10 ^ 42Quattuordecillion ("quattuordecillion"), // 10 ^ 45Quindecillion     ("quindecillion"),     // 10 ^ 48Sexdecillion      ("sexdecillion"),      // 10 ^ 51Septendecillion   ("septendecillion"),   // 10 ^ 54Octodecillion     ("octodecillion"),     // 10 ^ 57Novemdecillion    ("novemdecillion"),    // 10 ^ 60Vigintillion      ("vigintillion"),      // 10 ^ 63;final String display;Power(String display) { this.display = display; }}static enum Digit {Zero  ("zero", "zeroth", "ten", ""),One   ("one", "first", "eleven", "ten"),Two   ("two", "second", "twelve", "twenty"),Three ("three", "third", "thirteen", "thirty"),Four  ("four", "fourth", "fourteen", "fourty"),Five  ("five", "fifth", "fifteen", "fifty"),Six   ("six", "sixth", "sixteen", "sixty"),Seven ("seven", "seventh", "seventeen", "seventy"),Eight ("eight", "eighth", "eighteen", "eighty"),Nine  ("nine", "nineth", "nineteen", "ninety"),;final String display, displayOrdinal, plusTen, multiTen;Digit(String display, String displayOrdinal, String plusTen, String multiTen) {this.display = display;this.displayOrdinal = displayOrdinal;this.plusTen = plusTen;this.multiTen = multiTen;}}private static final Map<String, String> _Ordinals;static {_Ordinals = new HashMap<String, String>();for(Digit d : Digit.values())_Ordinals.put(d.display, d.displayOrdinal);}@Overrideint limit() {return 63;}@Overridepublic String getText(String number) {checkNumber(number);StringBuilder builder = new StringBuilder();buildText(builder, number);return builder.toString();}@Overridepublic String getOrdinalText(String number) {checkNumber(number);StringBuilder builder = new StringBuilder();buildText(builder, number);replaceLastTokenWithOrdinal(builder);return builder.toString();}private void buildText(StringBuilder builder, String number) {assert builder != null;if( number.startsWith("-") ) {builder.append(getConnectDisplay(Connect.Minus)).append(getConnectDisplay(Connect.AfterMinus));number = number.substring(1);}int power = 0;while(number.length() > (power + 1) * 3)power++;while(power > 0) {boolean modified = extendToken(builder, number, power * 3);if( modified )builder.append(getConnectDisplay(Connect.AfterNumber)).append(getPowerDisplay(Power.values()[power-1]));power--;}extendToken(builder, number, 0);}private boolean extendToken(StringBuilder builder, String number, int suffix) {assert builder != null && suffix < number.length();int len = number.length() - suffix;int hundreds = len > 2 ? (int)(number.charAt(len-3)-'0') : -1;int tens = len > 1 ? (int)(number.charAt(len-2)-'0') : -1;int inds = (int)(number.charAt(len-1)-'0');if( hundreds <= 0 && tens <= 0 && inds <= 0 && suffix > 0 )return false;else if( len > 3 )builder.append(getConnectDisplay(Connect.AfterPower));if( hundreds == 0 ) {if( len > 3 && (tens > 0 || inds > 0) )builder.append(getConnectDisplay(Connect.And)).append(getConnectDisplay(Connect.AfterAnd));}else if( hundreds > 0 ) {builder.append(getDigitName(Digit.values()[hundreds])).append(getConnectDisplay(Connect.AfterNumber)).append(getConnectDisplay(Connect.Hundred));if( tens > 0 || inds > 0 ) builder.append(getConnectDisplay(Connect.AfterHundred)).append(getConnectDisplay(Connect.And)).append(getConnectDisplay(Connect.AfterAnd));}if( tens > 1 ) {builder.append(getDigitMultiTen(Digit.values()[tens]));if( inds > 0 )builder.append(getConnectDisplay(Connect.AfterTen));}if( tens == 1 )builder.append(getDigitPlusTen(Digit.values()[inds]));else if( inds > 0 || number.length() == 1 )builder.append(getDigitName(Digit.values()[inds]));return true;}private void replaceLastTokenWithOrdinal(StringBuilder builder) {assert builder != null && builder.length() > 0;int suffix = builder.length()-1;while( suffix >= 0 && !isConnect(builder.charAt(suffix)) ) suffix--;String lastToken = builder.substring(suffix+1);builder.delete(suffix+1, builder.length()).append(toOrdinal(lastToken));}String getPowerDisplay(Power power) {assert power != null;return power.display; }String getConnectDisplay(Connect connect) {assert connect != null;return connect.display;}String getDigitName(Digit digit) {assert digit != null;return digit.display;}String toOrdinal(String name) {assert name != null && !name.isEmpty();String result = _Ordinals.get(name);if( result == null ) {if( name.charAt(name.length()-1) == 'y' )result = name.substring(0, name.length()-1) + "ieth";elseresult = name + "th";}return result;}String getDigitPlusTen(Digit digit) {assert digit != null;return digit.plusTen;}String getDigitMultiTen(Digit digit) {assert digit != null;return digit.multiTen;}boolean isConnect(char c) {return Connect.isConnect(c);}}/*----------------------------------------------------------------------------* EnglishWithDash with only Clean Space Connectors---------------------------------------------------------------------------*/private static class NumberTextEnglishCleanSpaceOnly extends NumberTextEnglish {private static final NumberText INSTANCE = new NumberTextEnglishCleanSpaceOnly();@OverrideString getConnectDisplay(Connect connect) {return connect == Connect.AfterTen ? " " : super.getConnectDisplay(connect);}}/*----------------------------------------------------------------------------* ChineseSimplified Implementation---------------------------------------------------------------------------*/private static class NumberTextChinese extends NumberText {private static final NumberText SIMPLIFIED = new NumberTextChinese(Type.Simplified);private static final NumberText TRADITIONAL =new NumberTextChinese(Type.Traditional);static enum Type { Simplified, Traditional; }static enum Connect {Di     ("第", "第"),Fu     ("负", "負"),Ling   ("零", "零"),Shi    ("十", "拾"),Bai    ("百", "佰"),Qian   ("千", "仟"),;final String display, displayTraditional;Connect(String display, String displayTraditional) { this.display = display; this.displayTraditional = displayTraditional;}}static enum Power {Wan    ("万", "萬"), // 10^4Yi     ("亿", "億"), // 10^8Zhao   ("兆", "兆"), // 10^12Jing   ("京", "京"), // 10^16 (enough for Long.MAX_VALUE)Gai    ("垓", "垓"), // 10^20Zi     ("秭", "秭"), // 10^24Rang   ("穰", "穰"), // 10^28Gou    ("沟", "溝"), // 10^32Jian   ("涧", "澗"), // 10^36Zheng  ("正", "正"), // 10^40Zai    ("载", "載"), // 10^44;final String display, displayTraditional;Power(String display, String displayTraditional) { this.display = display; this.displayTraditional = displayTraditional;}}static enum Digit {Ling   ("零", "零"), // just to occupy this positionYi     ("一", "壹"),Er     ("二", "贰"),San    ("三", "叁"),Si     ("四", "肆"),Wu     ("五", "伍"),Liu    ("六", "陆"),Qi     ("七", "柒"),Ba     ("八", "捌"),Jiu    ("九", "玖"),;final String display, displayTraditional;Digit(String display, String displayTraditional) { this.display = display; this.displayTraditional = displayTraditional;}}private final Type type;private NumberTextChinese(Type type) {assert type != null;this.type = type;}@Overrideint limit() {return 44;}@Overridepublic String getText(String number) {checkNumber(number);StringBuilder builder = new StringBuilder();buildText(builder, number);return builder.toString();}@Overridepublic String getOrdinalText(String number) {checkNumber(number);StringBuilder builder = new StringBuilder().append(Connect.Di);buildText(builder, number);return builder.toString();}private void buildText(StringBuilder builder, String number) {assert builder != null;if( number.startsWith("-") ) {builder.append(getConnectDisplay(Connect.Fu));number = number.substring(1);}int power = 0;while(number.length() > (power + 1) * 4)power++;while(power > 0) {if( extendToken(builder, number, power * 4) )builder.append(getPowerDisplay(Power.values()[power-1]));power--;}extendToken(builder, number, 0);}private boolean extendToken(StringBuilder builder, String number, int suffix) {assert builder != null && number.length() > suffix;int len = number.length() - suffix;int qian = len > 3 ? (int)(number.charAt(len-4)-'0') : -1;int bai = len > 2 ? (int)(number.charAt(len-3)-'0') : -1;int shi = len > 1 ? (int)(number.charAt(len-2)-'0') : -1;int ind = (int)(number.charAt(len-1)-'0');boolean nonZero = false; // true if any of the digits is not zeroif( qian == 0 ) { if( bai > 0 || shi > 0 || ind > 0 ) builder.append(getConnectDisplay(Connect.Ling)); }else if( qian > 0 ){builder.append(getDigitDisplay(Digit.values()[qian])).append(getConnectDisplay(Connect.Qian));nonZero = true;}if( bai == 0 ) { if( qian > 0 && (shi > 0 || ind > 0) ) builder.append(getConnectDisplay(Connect.Ling)); }else if( bai > 0 ){builder.append(getDigitDisplay(Digit.values()[bai])).append(getConnectDisplay(Connect.Bai));nonZero = true;}if( shi == 0 ) { if( bai > 0 && ind > 0 ) builder.append(getConnectDisplay(Connect.Ling)); }else if( shi > 0 ){if( number.length() > 2 || shi != 1 )builder.append(getDigitDisplay(Digit.values()[shi]));builder.append(getConnectDisplay(Connect.Shi));nonZero = true;}if( ind == 0 ){boolean addZero = len == 1;for(int i=1; addZero && i<=suffix; i++) {if( number.charAt(i) != '0' )addZero = false;}if( addZero ) builder.append(getConnectDisplay(Connect.Ling));}else {builder.append(getDigitDisplay(Digit.values()[ind]));nonZero = true;}return nonZero;}String getConnectDisplay(Connect connect) {assert connect != null;return type == Type.Simplified ? connect.display : connect.displayTraditional;}String getPowerDisplay(Power power) {assert power != null;return type == Type.Simplified ? power.display : power.displayTraditional;}String getDigitDisplay(Digit digit) {assert digit != null;return type == Type.Simplified ? digit.display : digit.displayTraditional;}}
}

Java数字转中文大写,数字转英文相关推荐

  1. 数字与中文大写数字互转(5千万亿亿亿亿以上的数字也支持转换)

    来源是看到知乎上一个奇葩问题: 任意大小的数字字符串转中文 其实10万以内的整数转换大写也太简单,今天我们要实现的是任意大小的数字字符串转大写. 首先我们要保证4位数以内的转换函数,能够处理各种含&q ...

  2. java实现数字转中文大写数字

    import java.util.HashMap; public class dds { /** *  * 数字转中文 *  * @param list *  * @return */ private ...

  3. ABAP 数字转换中文大写数字的方法

    写了2种转换的方式.显示XX元整,XX元角XX分 data:I_JE TYPE BSEG-DMBTR VALUE '1234.891'. data:e_JE TYPE CHAR100.DATA:s_z ...

  4. XtraReport报表入库单数字转中文大写数字

    先看看打印入库单的效果图,看如下: 客户要求合计一行,要求大写中文数字.XtraReport报表是如何做出以上图的效果呢?因为是要把数字转成大写中文数字,得先准备数字转大写中文数字的函数.因网上有很多 ...

  5. java实现人民币数字转换中文大写的工具实例代码demo分享

    原文:java实现人民币数字转换中文大写的工具实例代码demo分享 http://www.zuidaima.com/share/1816208858221568.htm 刚好在项目里面用到了数字转化为 ...

  6. JAVA 纯数字/金额数字转中文大写

    有时候一些金额数字需要转成中文大写展示到发票的金额框这类地方,包括一些纯粹的数量非金额的数字的大写转换,网上看很多都是金额的,纯数字的话有些不同,这里写了一个数字转中文大写的工具类: 1:金额数字转中 ...

  7. 将一组阿拉伯数字转换成中文大写数字

    题目大概:  将一组阿拉伯数字转换成中文大写数字  52306 ==> 伍万贰千叁百零陆 我实现了将文件中的一组数字(每行为一个数)  形如: Java代码   25364 466932300 ...

  8. Keras-10 【Seq2Seq示例】数字转中文大写

    Keras Seq2Seq示例 任务很简单,将数字转为中文大写金额,例如 11288 -> 壹万壹仟零捌拾捌元整 我们将尝试利用seq2seq来解决这一问题,整个示例包括以下部分: 建立数据集 ...

  9. 将数字0-9转为中文大写数字

    //转为中文大写数字 var n = 230 var fraction = ["角", "分"]; var digit = ["零", &q ...

  10. 把阿拉伯数字翻译成中文大写数字

    package com.zcw.zcwbook.demo15;/*** @program: zcwbook* @description: 把阿拉伯数字翻译成中文大写数字* @author: zhaoc ...

最新文章

  1. easyui的datagrid
  2. ubuntu联网经常掉线的解决方法
  3. 年薪75万的真实技术面试实践攻略(篇章二)
  4. Intellij idea快速查看Java类字节码
  5. VC++ .Net 实例学习
  6. 使用pytorch动手实现LSTM模块
  7. vue导入非es6 js文件_Vue项目兼容IE11
  8. 敏捷有效执行的关键软技能
  9. sublime text使用正则表达式批量给KV加
  10. Java程序猿如何从码农晋升为架构师
  11. Python 基础(常用数据结构)
  12. swf文件在线预览 html,在线浏览swf文件
  13. 由任意二叉树的前序遍历序列和中序遍历序列求二叉树的思想方法_算法与数据结构基础 - 二叉树(Binary Tree)...
  14. 計算機二級-java07
  15. python文字转图片_python-将文本文件转换为图形
  16. 【方案分享】2021快手品牌号专项营销方案.pdf(附下载链接)
  17. 一文足以了解什么是 Java 中的锁
  18. 37. 解决线程问题方式二(同步函数)
  19. 如何在Windows中安全删除垃圾箱(回收站)
  20. 我在Facebook工作四年的总结与反思

热门文章

  1. Pygame实战:打扑克嘛?Python教你“经典纸牌游戏21点”玩法
  2. 五一劳动节,给父母发个红包吧
  3. pr调整图层java,glm`prepected()`错误:没有适用于'predict'的方法应用于类“list”的对象...
  4. 迈道科技双重预防系统入选《2021年中国石油和化工企业500强发布会化工科技成果汇编》
  5. 利用python的爬虫技术爬取百度贴吧的帖子
  6. 视频播放--自动播放
  7. 咋阻止别人用计算机监控我家,我想用我家里的电脑控制办公室电脑的打印机怎么处理?...
  8. 开发的页面卡顿、慢?一文教你如何进行页面性能优化
  9. 第十二章 软件壳(四)(代码抽取型壳)
  10. vue项目PC端屏幕分辨率与窗口大小自适应