示例程序:
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)
代码如下
/* * 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 ^ 3 Million ("million"), // 10 ^ 6 Billion ("billion"), // 10 ^ 9 Trillion ("trillion"), // 10 ^ 12 Quadrillion ("quadrillion"), // 10 ^ 15 Quintillion ("quintillion"), // 10 ^ 18 (enough for Long.MAX_VALUE) Sextillion ("sextillion"), // 10 ^ 21 Septillion ("septillion"), // 10 ^ 24 Octillion ("octillion"), // 10 ^ 27 Nonillion ("nonillion"), // 10 ^ 30 Decillion ("decillion"), // 10 ^ 33 Undecillion ("undecillion"), // 10 ^ 36 Duodecillion ("duodecillion"), // 10 ^ 39 Tredecillion ("tredecillion"), // 10 ^ 42 Quattuordecillion ("quattuordecillion"), // 10 ^ 45 Quindecillion ("quindecillion"), // 10 ^ 48 Sexdecillion ("sexdecillion"), // 10 ^ 51 Septendecillion ("septendecillion"), // 10 ^ 54 Octodecillion ("octodecillion"), // 10 ^ 57 Novemdecillion ("novemdecillion"), // 10 ^ 60 Vigintillion ("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); } @Override int limit() { return 63; } @Override public String getText(String number) { checkNumber(number); StringBuilder builder = new StringBuilder(); buildText(builder, number); return builder.toString(); } @Override public 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"; else result = 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(); @Override String 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^4 Yi ("亿", "億"), // 10^8 Zhao ("兆", "兆"), // 10^12 Jing ("京", "京"), // 10^16 (enough for Long.MAX_VALUE) Gai ("垓", "垓"), // 10^20 Zi ("秭", "秭"), // 10^24 Rang ("穰", "穰"), // 10^28 Gou ("沟", "溝"), // 10^32 Jian ("涧", "澗"), // 10^36 Zheng ("正", "正"), // 10^40 Zai ("载", "載"), // 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 position Yi ("一", "壹"), 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; } @Override int limit() { return 44; } @Override public String getText(String number) { checkNumber(number); StringBuilder builder = new StringBuilder(); buildText(builder, number); return builder.toString(); } @Override public 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 zero if( 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; } } }
相关推荐
sqlserver数字转金额大写,输入数字返回汉字大写
一般用于货币,数字对汉字大写的转换,以前见过一个这样的程序,鉴于注释不完整,算法看不懂,还有若干bug,自己实现了一个,源码发布,望指正交流。 邮箱:yyk882002@163.com
输入10亿以下的数字,自动转成大写中文的字符串,如输入920807080,则返回玖亿贰仟萬零捌拾萬零柒仟零捌拾
该资源是asp.net+c#页面程序,采用四种方法将数字形式的金额转换为中英文金额写法。
批量实现文件夹和所有目录里的文件英文字母小写转大写,把程序放到需要改的文件同一个目录里就可以
将数字翻译成英语的JavaScript,可以自动判断出你输入的数字是多大,它会自动拼合,按亿、千万、百万的语法翻译出来,挺实用。
java实现中文排序,按数字字母汉字的顺序进行排序
货币大写金额转换插件ChinaNumToEnglishNum.js,在线将阿拉伯数字转换成中文大写、人民币大写转换工具
//c为对应大写单位,d为当前大写字符串的最后一个汉字 a=str_int.SubString(i,1); a_int=StrToInt(a); b=dx_sz.SubString((a_int*2+1),2);// b=copy(dx_sz,(a_int2+1),2); c=dx_dw.SubString(((14-len_int+i-...
EditText输入限制,比如只能输入6个汉字或12个英文字母、数字
实现如下功能: 全拼不带声调 全拼带声调 全拼带数字声调 小写缩写 大写缩写 中文名字转英文
:balloon: : 「英文数字」和「阿拉伯数字」互转正在收集需求中! :balloon: : Julia 语言版本已经上线,正在丰富基础功能。 1 功能 1.1 中文数字 => 阿拉伯数字 支持 中文数字 => 阿拉伯数字; 支持 大写中文数字 =...
数字大小写转换是指将数字表示的阿拉伯数字(例如123)转换为相应的中文大写数字(例如一百二十三)或英文单词形式(例如One Hundred Twenty-Three),或者将中文大写数字或英文单词形式转换为阿拉伯数字。
英文字母大写转小写;在文本中查找指定的字符出现的次数;字符串+字符串=新的字符串;字符串的加密解密;字符串颠倒输出;字符串解码后长度;字符串转换;字符串转字节数组;字符串组合与裁分等。
实现如下功能: 全拼不带声调 全拼带声调 全拼带数字声调 小写缩写 大写缩写 中文名字转英文 新增功能 拼音在文字上方
1.使用场景 ...例如:数字(0->9)->大写字母(A->Z)->小写字母(a->z)->中文拼音(a->z) 2.代码解析 tooltip-effect=dark class=xg-table xss=removed max-height=600> width=60> <el-t
中文数字和英文数字大小写互相转换,SWF格式直接使用回车后变换。
输入数据的形式和范围:可以输入大写、小写的英文字母、任何数字及标点符号。 输出形式:(1)分行输出用户输入的各行字符;(2)分4行输出"全部字母数"、"数字个数"、"空格个数"、"文章总字数"(3)输出删除...
指法练习:每字词连打10次,可增效N倍,中文转英文按右Shift,转大写按Caps! 试用到期:重启删除,或3键Ctrl Alt Del任务管理器/关机栏/重启,消除干扰! 卸载软件:点击屏右下角输入图标\选设置\删除;或从...
一个不错的数字的正则表达式验证的电子参考书。内容预览: 验证数字:^[0-9]*$ 验证n位的数字:^\d{n}$ 验证至少n位数字:^\d{n,}$ 验证m-n位的数字:^\d{m,n..."^[A-Za-z0-9]+$" //由数字和26个英文字母组成的字符...