-
请问如何替换字符串中大写中文数字为阿拉伯数字?5
我有几个字符串,如 我有十块钱,你有二十三块钱,他有二元钱。我想转换成 “我有10块钱,你有23块钱,他有2元钱。”,请问如何转换,也就是如何把字符串中大写中文数字转换成阿拉伯数字。大写中文数字可限制在一到九百九十九之间。
谢谢!2014年5月06日 23:04
10个答案 按时间排序 按投票排序
-
采纳的答案
package test; import java.text.MessageFormat; import java.util.ArrayList; import java.util.HashMap; import java.util.LinkedHashMap; import java.util.List; import java.util.Map; import java.util.regex.Matcher; import java.util.regex.Pattern; public class Test3 { public static void main(String[] args) { String s = "我有十块钱, 你有二十三块钱, 他有二元钱"; Pattern p; Matcher m; for(String regex : regexMap.keySet()) { p = Pattern.compile(regex); m = p.matcher(s); while(m.find()) { String exper = regexMap.get(regex); List<String> list = new ArrayList<String>(); for(int i = 1; i <= m.groupCount(); i++) { list.add(NumRegex.numMap.get(m.group(i))); } exper = MessageFormat.format(exper, list.toArray()); String text = m.group(); String value = experToValue(exper); s = s.replace(text, value); } } System.out.println(s); } public static String experToValue(String exper) { String[] experArr = null; experArr = exper.split(encodeUnicode("+")); int value = 0; for(String sExper : experArr) { String[] sExperArr = sExper.split(encodeUnicode("*")); value += Integer.valueOf(sExperArr[0]) * Integer.valueOf(sExperArr[1]); } return String.valueOf(value); } //转换为unicode private static String encodeUnicode(String gbString) { char[] utfBytes = gbString.toCharArray(); String unicodeBytes = ""; for (int i : utfBytes) { String hexB = Integer.toHexString(i); if (hexB.length() <= 2) { hexB = "00" + hexB; } unicodeBytes = unicodeBytes + "\\u" + hexB; } return unicodeBytes; } //一、十一、二十一、三百二十一、三百零一、二十、三百、三百二、十 private static final Map<String, String> regexMap = new LinkedHashMap<String, String>(); static { //三百二十一 String regex = NumRegex.getNumRegex() + encodeUnicode("百") + NumRegex.getNumRegex() + encodeUnicode("十") + NumRegex.getNumRegex(); String exper = "{0}*100+{1}*10+{2}*1"; regexMap.put(regex, exper); //三百零一 regex = NumRegex.getNumRegex() + encodeUnicode("百") + encodeUnicode("零") + NumRegex.getNumRegex(); exper="{0}*100+{1}*1"; regexMap.put(regex, exper); //三百二 regex = NumRegex.getNumRegex() + encodeUnicode("百") + NumRegex.getNumRegex(); exper="{0}*100+{1}*10"; regexMap.put(regex, exper); //三百 regex = NumRegex.getNumRegex() + encodeUnicode("百"); exper="{0}*100"; regexMap.put(regex, exper); //二十一 regex = NumRegex.getNumRegex() + encodeUnicode("十") + NumRegex.getNumRegex(); exper="{0}*10+{1}*1"; regexMap.put(regex, exper); //二十 regex = NumRegex.getNumRegex() + encodeUnicode("十"); exper="{0}*10"; regexMap.put(regex, exper); //十一 regex = encodeUnicode("十") + NumRegex.getNumRegex(); exper="1*10+{0}*1"; regexMap.put(regex, exper); //十 regex = encodeUnicode("十"); exper="1*10"; regexMap.put(regex, exper); //一 regex = NumRegex.getNumRegex(); exper="{0}*1"; regexMap.put(regex, exper); } static class NumRegex { public static final Map<String, String> numMap = new HashMap<String, String>(); static { numMap.put("一", "1"); numMap.put("二", "2"); numMap.put("三", "3"); numMap.put("四", "4"); numMap.put("五", "5"); numMap.put("六", "6"); numMap.put("七", "7"); numMap.put("八", "8"); numMap.put("九", "9"); } private static String numRegex; public static String getNumRegex() { if(numRegex == null || numRegex.length() == 0) { numRegex = "(["; for(String s : numMap.keySet()) { numRegex += encodeUnicode(s); } numRegex += "])"; } return numRegex; } } }
自己写的傻办法, 同望高手提供算法思路2014年5月07日 12:17
-
想了下, 写了个新方法, 基本可以支持所有阿拉伯数字
package test; import java.util.HashMap; import java.util.LinkedHashMap; import java.util.Map; import java.util.regex.Matcher; import java.util.regex.Pattern; public class Test4 { public static void main(String[] args) { String text = "千啦啦啦,我有十块钱, 你有二十三块钱, 他有二元钱, 我是三百, 你是二百二, 还有五百六十七, 也许是十三, 那么九百零六, 哈哈一千零三十万零三百."; System.out.println(bulidTextZHToALB(text)); } public static String bulidTextZHToALB(String text) { Pattern p = Pattern.compile(numRegex); Matcher m = p.matcher(text); while(m.find()) { String numZH = m.group(); if(numZH.length() !=1 || numMap.containsKey(numZH) || zhTen.equals(numZH)) { String numALB = NumZHToALB(numZH); text = text.replaceFirst(numZH, numALB); } } return text; } private static String NumZHToALB(String numZH) { int numALB = 0; int formIndex = 0; for(String unitNum : unitNumMap.keySet()) { int index = numZH.indexOf(unitNum); if(index != -1 ) { numALB += NumZHToALB(numZH.substring(formIndex, index), unitNumMap.get(unitNum)); formIndex = index + 1; } } numALB += NumZHToALB(numZH.substring(formIndex), 1); return String.valueOf(numALB); } private static int NumZHToALB(String numZH, int unitNum) { int length = numZH.length(); int numALB = 0; if(length != 0) { int fromIndex = 0; for(String unit : unitMap.keySet()) { int index = numZH.indexOf(unit, fromIndex); if(index != -1) { fromIndex = index + unit.length(); String prevChar = zhOne; if(index != 0 && numMap.containsKey(prevChar)) { prevChar = String.valueOf(numZH.charAt(index - 1)); } numALB += numMap.get(prevChar) * unitMap.get(unit); } } String lastChar = String.valueOf(numZH.charAt(length - 1)); if(numMap.containsKey(lastChar)) { String pChar = zhTen; if(length != 1) { pChar = String.valueOf(numZH.charAt(length - 2)); if(zhZero.equals(pChar)) { pChar = zhTen; } } numALB += numMap.get(lastChar) * unitMap.get(pChar)/10; } } return numALB * unitNum; } private static String encodeUnicode(String gbString) { char[] utfBytes = gbString.toCharArray(); String unicodeBytes = ""; for (int i : utfBytes) { String hexB = Integer.toHexString(i); if (hexB.length() <= 2) { hexB = "00" + hexB; } unicodeBytes = unicodeBytes + "\\u" + hexB; } return unicodeBytes; } private static final String zhZero = "零"; private static final String zhOne = "一"; private static final String zhTen = "十"; private static final Map<String, Integer> numMap = new HashMap<String, Integer>(); static { numMap.put("零", 0); numMap.put("一", 1); numMap.put("二", 2); numMap.put("三", 3); numMap.put("四", 4); numMap.put("五", 5); numMap.put("六", 6); numMap.put("七", 7); numMap.put("八", 8); numMap.put("九", 9); } private static final Map<String, Integer> unitNumMap = new LinkedHashMap<String, Integer>(); static { unitNumMap.put("亿", 100000000); unitNumMap.put("万", 10000); } private static final Map<String, Integer> unitMap = new LinkedHashMap<String, Integer>(); static { unitMap.put("千", 1000); unitMap.put("百", 100); unitMap.put("十", 10); } private static String numRegex; static { numRegex = "["; for(String s : numMap.keySet()) { numRegex += encodeUnicode(s); } for(String s : unitMap.keySet()) { numRegex += encodeUnicode(s); } for(String s : unitNumMap.keySet()) { numRegex += encodeUnicode(s); } numRegex += "]+"; } }
2014年5月09日 17:52
-
package test object _t { def main(args: Array[String]): Unit = { val p0 = """(一|二|三|四|五|六|七|八|九)百(一|二|三|四|五|六|七|八|九)十(一|二|三|四|五|六|七|八|九)""".r val p1 = """(一|二|三|四|五|六|七|八|九)百(一|二|三|四|五|六|七|八|九)十?""".r val p2 = """(一|二|三|四|五|六|七|八|九)百""".r val p3 = """(一|二|三|四|五|六|七|八|九)十(一|二|三|四|五|六|七|八|九)""".r val p4 = """(一|二|三|四|五|六|七|八|九)十""".r val p5 = """(一|二|三|四|五|六|七|八|九|零)""".r val mapping=Map("一"->1,"二"->2,"三"->3,"四"->4,"五"->5,"六"->6,"七"->7,"八"->8,"九"->9,"零"->0) val orginal ="我有三百二十五元钱,有二十个硬币,其中有五个一元" var text = orginal text=p0.replaceAllIn(text, matchs => { mapping(matchs.group(1))*100+mapping(matchs.group(2))*10+mapping(matchs.group(3))+"" }) text=p1.replaceAllIn(text,matchs =>{ mapping(matchs.group(1))*100+mapping(matchs.group(2))*10+"" }) text=p2.replaceAllIn(text,matchs =>{ mapping(matchs.group(1))*100+"" }) text=p3.replaceAllIn(text,matchs =>{ mapping(matchs.group(1))*10+mapping(matchs.group(2))+"" }) text=p4.replaceAllIn(text,matchs =>{ mapping(matchs.group(1))*10+"" }) text=p5.replaceAllIn(text,matchs =>{ mapping(matchs.group(1))+"" }) println(text) } }
写了一个正则表达..2014年5月09日 13:52
-
public static void main(String args[]){ String ss = "二百三十三"; System.out.println(getStringToNumber(ss)); } /** * 获取一个文本的数字表达形式 * @param cNumber * @return */ public static int getStringToNumber(String cNumber){ Map<Character, Character> numMap = new HashMap<Character, Character>(10); numMap.put('一', '1'); numMap.put('二', '2'); numMap.put('三', '3'); numMap.put('四', '4'); numMap.put('五', '5'); numMap.put('六', '6'); numMap.put('七', '7'); numMap.put('八', '8'); numMap.put('九', '9'); numMap.put('零', '0'); char[] chars = cNumber.toCharArray(); StringBuilder result = new StringBuilder(); for(int i = 0; i < chars.length; i++){ Character number = numMap.get(chars[i]); if(number != null){ result.append(number); } } return Integer.parseInt(result.toString()); }
2014年5月08日 17:52
-
public static void main(String args[]){
String ss = "二百三十三";
System.out.println(getStringToNumber(ss));
}
/**
* 获取一个文本的数字表达形式
* @param cNumber
* @return
*/
public static int getStringToNumber(String cNumber){
Map<Character, Character> numMap = new HashMap<Character, Character>(10);
numMap.put('一', '1');
numMap.put('二', '2');
numMap.put('三', '3');
numMap.put('四', '4');
numMap.put('五', '5');
numMap.put('六', '6');
numMap.put('七', '7');
numMap.put('八', '8');
numMap.put('九', '9');
numMap.put('零', '0');
char[] chars = cNumber.toCharArray();
StringBuilder result = new StringBuilder();
for(int i = 0; i < chars.length; i++){
Character number = numMap.get(chars[i]);
if(number != null){
result.append(number);
}
}
return Integer.parseInt(result.toString());
}2014年5月08日 17:51
-
我觉得可以做判断替换,先把大写中文截取出来,判断第一个字符,如果是五,就替换5,总共有10个判断,然后判断第二个字符,如果是百,先不做操作,同样的如果是十,也不做操作,如果是数字,就拼接在后面,假如是五百二十,拼接后是52 这时判断如果含有百,也就是3位数,但是你只有两位数,自动补全一个0,同样的,如果是五十,得到是5,含有10代表有两位数,自动补全0,则为50
2014年5月07日 08:32
相关推荐
在Java编程语言中,将中文数字转换为阿拉伯数字是一个常见的需求,特别是在处理中文文本数据时。这个场景下,我们有一个名为“中文数字转成阿拉伯数字 java 实现”的压缩包,包含了一个实现此功能的Java包和一个单元...
在这个过程中,我们需要使用数组来存储中文大写数字和单位,然后通过遍历阿拉伯数字字符串,逐个将数字转换为中文大写数字,并加上相应的单位。 在这个示例代码中,我们定义了两个数组:name数组和unit数组。name...
本文将深入探讨如何在Java中替换字符串中的特定符号,并解析代码示例,以便更好地理解其工作原理。 ### Java中替换字符串中的符号 在Java中,`String`类提供了多种方法来操作字符串,包括查找、替换、分割等。其中...
在IT领域,中文数字转换阿拉伯数字是一个常见的编程需求,尤其在中国的文化背景下,有时需要将中文表述的数字转化为阿拉伯数字用于计算或数据处理。这个任务涉及到自然语言处理(NLP)和字符串处理技术,通常通过...
在本例中,我们将创建一个名为 `fun_cgnum` 的存储过程,该过程将阿拉伯数字作为输入参数,并返回对应的大写中文字符串。 以下是存储过程的实现代码: ```sql CREATE FUNCTION fun_cgnum (@num INT) RETURNS ...
在IT领域,尤其是在财务软件开发或数据处理中,经常需要将阿拉伯数字金额转换为中文大写,以便在财务报表、发票或合同中清晰准确地表示金额。这是因为中文大写数字在金融交易中能减少因书写错误导致的混淆,增强财务...
总之,理解和实现C语言与Lua之间的中文数字与阿拉伯数字的互转是一项涉及字符串处理、数值转换和语言特性的任务。这不仅要求编程技能,还需要对两种语言的理解和对中文数字的熟悉。在实际应用中,这样的功能可以广泛...
3. 使用条件语句或查找表,将每一位阿拉伯数字转换为对应的中文数字,并添加到`result`字符串中。 4. 处理中文的“十”、“百”、“千”等单位。在合适的位数(比如每四位)加入相应的中文单位,但需要注意去除不必...
标题和描述中提到的知识点是关于如何使用JavaScript(简称js)编程语言将阿拉伯数字转换为中文大写形式。这种转换通常在财务相关的软件中很常见,尤其是涉及到金额表述时,为了符合财务规范或增加可读性,需要将数字...
编写程序,处理只包含数字与大写字母的字符串.txt
在中文环境中,将阿拉伯数字转换为大写汉字是一项非常实用的功能,尤其是在财务、银行系统等需要将金额以大写形式显示的场合。例如,当需要在支票或发票上填写金额时,通常会使用大写汉字来表示具体的数值,以此防止...
在Java或Kotlin中,我们可以创建一个Map,将数字与对应的中文字符映射起来,然后通过遍历数字字符串并查找对应的中文字符来完成转换。以下是一个简单的Java示例: ```java Map, String> numToChinese = new HashMap...
阿拉伯数字(1、2、3等)是我们日常使用的数字系统,但在正式的会计文档中,通常需要将这些数字转换为中文大写(壹、贰、叁等),以防止篡改和提高审计准确性。在编程领域,尤其是使用Visual Basic (VB) 这样的语言...
根据提供的文件信息,可以看出这是一个Java程序,用于将阿拉伯数字转换为中文大写形式,并且能够处理包含小数点的情况。接下来我们将对这个程序的关键部分进行详细的解析与解释。 ### 核心知识点概述 1. **数据...
在编程领域,尤其是在中文编程环境中,有时我们需要将阿拉伯数字转换为汉字大写,这在财务、会计等领域的报表和凭证中尤为常见。易语言作为一款中国本土开发的、以中文编程为特色的编程语言,提供了方便的方式来实现...
发票报销过程中,正确无误地将阿拉伯数字转换成大写中文数字是至关重要的,因为这直接影响到财务报表的准确性和合法性。"发票报销辅助工具 阿拉伯数字转大写中文数字"就是一个专为此目的设计的应用。这个工具在VS...
`zhwyxzs`方法通过遍历输入字符串`x`的每个字符,将其转换为对应的中文大写数字,并结合位置级别的名称(例如“拾”、“百”、“千”)来构建结果字符串。这里利用了一个字符串数组`stringArrayLevelNames`存储了...
在Android开发过程中,有时我们需要将阿拉伯数字(1, 2, 3...)转换成中文小写数字(一,二,三...),特别是在涉及到文化习惯或者用户界面本地化的时候,如书籍页码显示。这个任务涉及到字符串处理和字符映射,下面...
在中文中,阿拉伯数字1至9对应的汉字大写分别是壹、贰、叁、肆、伍、陆、柒、捌、玖。零对应的是零或〇。小数点后的部分,元、角、分分别代表整数部分、十分之一和百分之一。例如,123.45在大写中是壹佰贰拾叁元肆角...
这个题目要求实现一个程序,能够读取输入的阿拉伯数字字符串,然后将其转换为符合中国会计规范的中文大写金额表示。在这个过程中,我们需要处理整数部分、小数部分以及各种可能的零、负号等特殊情况。 首先,我们要...