0 0

请问如何替换字符串中大写中文数字为阿拉伯数字?5

我有几个字符串,如 我有十块钱,你有二十三块钱,他有二元钱。我想转换成 “我有10块钱,你有23块钱,他有2元钱。”,请问如何转换,也就是如何把字符串中大写中文数字转换成阿拉伯数字。大写中文数字可限制在一到九百九十九之间。
谢谢!
2014年5月06日 23:04

10个答案 按时间排序 按投票排序

0 0

采纳的答案

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
0 0

想了下, 写了个新方法, 基本可以支持所有阿拉伯数字

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
0 0

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
0 0

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
0 0

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
0 0

一天一次,三心两意,这种怎么搞?

2014年5月07日 18:23
0 0

http://www.oschina.net/code/snippet_698836_12873

2014年5月07日 10:36
0 0

“十分高兴、一心一意”这些要要改吗?

2014年5月07日 09:12
0 0

我觉得可以做判断替换,先把大写中文截取出来,判断第一个字符,如果是五,就替换5,总共有10个判断,然后判断第二个字符,如果是百,先不做操作,同样的如果是十,也不做操作,如果是数字,就拼接在后面,假如是五百二十,拼接后是52 这时判断如果含有百,也就是3位数,但是你只有两位数,自动补全一个0,同样的,如果是五十,得到是5,含有10代表有两位数,自动补全0,则为50

2014年5月07日 08:32
0 0

排列组合一下,就出来了。

2014年5月06日 23:55

相关推荐

    中文数字转成阿拉伯数字 java 实现

    在Java编程语言中,将中文数字转换为阿拉伯数字是一个常见的需求,特别是在处理中文文本数据时。这个场景下,我们有一个名为“中文数字转成阿拉伯数字 java 实现”的压缩包,包含了一个实现此功能的Java包和一个单元...

    阿拉伯数字转换为中文大写

    在这个过程中,我们需要使用数组来存储中文大写数字和单位,然后通过遍历阿拉伯数字字符串,逐个将数字转换为中文大写数字,并加上相应的单位。 在这个示例代码中,我们定义了两个数组:name数组和unit数组。name...

    java替换字符串中的符号

    本文将深入探讨如何在Java中替换字符串中的特定符号,并解析代码示例,以便更好地理解其工作原理。 ### Java中替换字符串中的符号 在Java中,`String`类提供了多种方法来操作字符串,包括查找、替换、分割等。其中...

    中文数字转换阿拉伯数字

    在IT领域,中文数字转换阿拉伯数字是一个常见的编程需求,尤其在中国的文化背景下,有时需要将中文表述的数字转化为阿拉伯数字用于计算或数据处理。这个任务涉及到自然语言处理(NLP)和字符串处理技术,通常通过...

    sql server阿拉伯数字转大写中文存储过程

    在本例中,我们将创建一个名为 `fun_cgnum` 的存储过程,该过程将阿拉伯数字作为输入参数,并返回对应的大写中文字符串。 以下是存储过程的实现代码: ```sql CREATE FUNCTION fun_cgnum (@num INT) RETURNS ...

    金额阿拉伯数字转换中文大写(全)

    在IT领域,尤其是在财务软件开发或数据处理中,经常需要将阿拉伯数字金额转换为中文大写,以便在财务报表、发票或合同中清晰准确地表示金额。这是因为中文大写数字在金融交易中能减少因书写错误导致的混淆,增强财务...

    c和lua的中文和阿拉伯数字互转

    总之,理解和实现C语言与Lua之间的中文数字与阿拉伯数字的互转是一项涉及字符串处理、数值转换和语言特性的任务。这不仅要求编程技能,还需要对两种语言的理解和对中文数字的熟悉。在实际应用中,这样的功能可以广泛...

    阿拉伯数字转中文数字(vb)

    3. 使用条件语句或查找表,将每一位阿拉伯数字转换为对应的中文数字,并添加到`result`字符串中。 4. 处理中文的“十”、“百”、“千”等单位。在合适的位数(比如每四位)加入相应的中文单位,但需要注意去除不必...

    js实现将数字转换为中文大写

    标题和描述中提到的知识点是关于如何使用JavaScript(简称js)编程语言将阿拉伯数字转换为中文大写形式。这种转换通常在财务相关的软件中很常见,尤其是涉及到金额表述时,为了符合财务规范或增加可读性,需要将数字...

    编写程序,处理只包含数字与大写字母的字符串.txt

    编写程序,处理只包含数字与大写字母的字符串.txt

    阿拉伯数字转大写汉字

    在中文环境中,将阿拉伯数字转换为大写汉字是一项非常实用的功能,尤其是在财务、银行系统等需要将金额以大写形式显示的场合。例如,当需要在支票或发票上填写金额时,通常会使用大写汉字来表示具体的数值,以此防止...

    Android中数字转中文,金额转大写

    在Java或Kotlin中,我们可以创建一个Map,将数字与对应的中文字符映射起来,然后通过遍历数字字符串并查找对应的中文字符来完成转换。以下是一个简单的Java示例: ```java Map, String&gt; numToChinese = new HashMap...

    会计阿拉伯数字转换中文大写

    阿拉伯数字(1、2、3等)是我们日常使用的数字系统,但在正式的会计文档中,通常需要将这些数字转换为中文大写(壹、贰、叁等),以防止篡改和提高审计准确性。在编程领域,尤其是使用Visual Basic (VB) 这样的语言...

    java 阿拉伯数字转化中文大写

    根据提供的文件信息,可以看出这是一个Java程序,用于将阿拉伯数字转换为中文大写形式,并且能够处理包含小数点的情况。接下来我们将对这个程序的关键部分进行详细的解析与解释。 ### 核心知识点概述 1. **数据...

    易语言数字转换汉字大写

    在编程领域,尤其是在中文编程环境中,有时我们需要将阿拉伯数字转换为汉字大写,这在财务、会计等领域的报表和凭证中尤为常见。易语言作为一款中国本土开发的、以中文编程为特色的编程语言,提供了方便的方式来实现...

    发票报销辅助工具 阿拉伯数字转大写中文数字

    发票报销过程中,正确无误地将阿拉伯数字转换成大写中文数字是至关重要的,因为这直接影响到财务报表的准确性和合法性。"发票报销辅助工具 阿拉伯数字转大写中文数字"就是一个专为此目的设计的应用。这个工具在VS...

    阿拉伯数字转换成中文大写的算法(C#窗体程序)

    `zhwyxzs`方法通过遍历输入字符串`x`的每个字符,将其转换为对应的中文大写数字,并结合位置级别的名称(例如“拾”、“百”、“千”)来构建结果字符串。这里利用了一个字符串数组`stringArrayLevelNames`存储了...

    阿拉伯数字转换为中文小写数字

    在Android开发过程中,有时我们需要将阿拉伯数字(1, 2, 3...)转换成中文小写数字(一,二,三...),特别是在涉及到文化习惯或者用户界面本地化的时候,如书籍页码显示。这个任务涉及到字符串处理和字符映射,下面...

    阿拉伯数字金额转换为大写数字金额

    在中文中,阿拉伯数字1至9对应的汉字大写分别是壹、贰、叁、肆、伍、陆、柒、捌、玖。零对应的是零或〇。小数点后的部分,元、角、分分别代表整数部分、十分之一和百分之一。例如,123.45在大写中是壹佰贰拾叁元肆角...

    java写的将阿拉伯数字转化为中文金额的大写方式

    这个题目要求实现一个程序,能够读取输入的阿拉伯数字字符串,然后将其转换为符合中国会计规范的中文大写金额表示。在这个过程中,我们需要处理整数部分、小数部分以及各种可能的零、负号等特殊情况。 首先,我们要...

Global site tag (gtag.js) - Google Analytics