在Java中将单词转换为数字

我已经看到很多算法,你给它们一个数字说“123”,它将它转换为123。 但我似乎无法找到相反的东西,而我确实找到的只能达到数字1000,任何人都可以用正确的方式指导我,因为我可以做的就是创建一个方法“一千二百三十四“并且还给”1234“

我希望下面的代码能够在大多数情况下完成工作。 但是可能需要进行一些修改,因为我还没有正确测试。

假设:

  1. 不允许使用正数,负数,加号,减号。
  2. Lac,crore是不允许的。
  3. 仅支持英语。

如果你需要支持前两点,你可以很容易地做到这一点。

boolean isValidInput = true; long result = 0; long finalResult = 0; List allowedStrings = Arrays.asList ( "zero","one","two","three","four","five","six","seven", "eight","nine","ten","eleven","twelve","thirteen","fourteen", "fifteen","sixteen","seventeen","eighteen","nineteen","twenty", "thirty","forty","fifty","sixty","seventy","eighty","ninety", "hundred","thousand","million","billion","trillion" ); String input="One hundred two thousand and thirty four"; if(input != null && input.length()> 0) { input = input.replaceAll("-", " "); input = input.toLowerCase().replaceAll(" and", " "); String[] splittedParts = input.trim().split("\\s+"); for(String str : splittedParts) { if(!allowedStrings.contains(str)) { isValidInput = false; System.out.println("Invalid word found : "+str); break; } } if(isValidInput) { for(String str : splittedParts) { if(str.equalsIgnoreCase("zero")) { result += 0; } else if(str.equalsIgnoreCase("one")) { result += 1; } else if(str.equalsIgnoreCase("two")) { result += 2; } else if(str.equalsIgnoreCase("three")) { result += 3; } else if(str.equalsIgnoreCase("four")) { result += 4; } else if(str.equalsIgnoreCase("five")) { result += 5; } else if(str.equalsIgnoreCase("six")) { result += 6; } else if(str.equalsIgnoreCase("seven")) { result += 7; } else if(str.equalsIgnoreCase("eight")) { result += 8; } else if(str.equalsIgnoreCase("nine")) { result += 9; } else if(str.equalsIgnoreCase("ten")) { result += 10; } else if(str.equalsIgnoreCase("eleven")) { result += 11; } else if(str.equalsIgnoreCase("twelve")) { result += 12; } else if(str.equalsIgnoreCase("thirteen")) { result += 13; } else if(str.equalsIgnoreCase("fourteen")) { result += 14; } else if(str.equalsIgnoreCase("fifteen")) { result += 15; } else if(str.equalsIgnoreCase("sixteen")) { result += 16; } else if(str.equalsIgnoreCase("seventeen")) { result += 17; } else if(str.equalsIgnoreCase("eighteen")) { result += 18; } else if(str.equalsIgnoreCase("nineteen")) { result += 19; } else if(str.equalsIgnoreCase("twenty")) { result += 20; } else if(str.equalsIgnoreCase("thirty")) { result += 30; } else if(str.equalsIgnoreCase("forty")) { result += 40; } else if(str.equalsIgnoreCase("fifty")) { result += 50; } else if(str.equalsIgnoreCase("sixty")) { result += 60; } else if(str.equalsIgnoreCase("seventy")) { result += 70; } else if(str.equalsIgnoreCase("eighty")) { result += 80; } else if(str.equalsIgnoreCase("ninety")) { result += 90; } else if(str.equalsIgnoreCase("hundred")) { result *= 100; } else if(str.equalsIgnoreCase("thousand")) { result *= 1000; finalResult += result; result=0; } else if(str.equalsIgnoreCase("million")) { result *= 1000000; finalResult += result; result=0; } else if(str.equalsIgnoreCase("billion")) { result *= 1000000000; finalResult += result; result=0; } else if(str.equalsIgnoreCase("trillion")) { result *= 1000000000000L; finalResult += result; result=0; } } finalResult += result; result=0; System.out.println(finalResult); } } 

完美归功于Kartic的优雅答案。 我已添加它以允许处理大量文本,其中分散了这些类型的“字数”。 不像我希望的那样干净,因为我必须处理它而不会丢失任何格式。

这是一项正在进行的工作,但可能对人们有用: https : //github.com/jgraham0325/words-to-numbers/blob/master/src/main/java/org/jg/wordstonumbers/WordsToNumbersUtil.java

 package com; import java.util.HashMap; public class WordNNumber { static HashMap numbers= new HashMap(); static HashMap onumbers= new HashMap(); static HashMap tnumbers= new HashMap(); static { numbers.put("zero", 0); numbers.put("one", 1); numbers.put("two", 2); numbers.put("three", 3); numbers.put("four", 4); numbers.put("five", 5); numbers.put("six", 6); numbers.put("seven", 7); numbers.put("eight", 8); numbers.put("nine", 9); numbers.put("ten", 10); numbers.put("eleven", 11); numbers.put("twelve", 12); numbers.put("thirteen", 13); numbers.put("fourteen", 14); numbers.put("fifteen", 15); numbers.put("sixteen", 16); numbers.put("seventeen", 17); numbers.put("eighteen", 18); numbers.put("nineteen", 19); tnumbers.put("twenty", 20); tnumbers.put("thirty", 30); tnumbers.put("fourty", 40); tnumbers.put("fifty", 50); tnumbers.put("sixty", 60); tnumbers.put("seventy", 70); tnumbers.put("eighty", 80); tnumbers.put("ninety", 90); onumbers.put("hundred", 100); onumbers.put("thousand", 1000); onumbers.put("million", 1000000); onumbers.put("billion", 1000000000); //numbers.put("", ); } public static void main(String args[]){ String input1="fifty five million twenty three thousand ninety one"; String input2="fifty five billion three thousand one"; String input3="fifty five million ninety one"; wordToNumber(input1); wordToNumber(input2); wordToNumber(input3); } private static void wordToNumber(String input) { System.out.println("===========\nInput string = "+input); long sum=0; Integer temp=null; Integer previous=0; String [] splitted= input.toLowerCase().split(" "); for(String split:splitted){ if( numbers.get(split)!=null){ temp= numbers.get(split); sum=sum+temp; previous=previous+temp; } else if(onumbers.get(split)!=null){ if(sum!=0){ sum=sum-previous; } sum=sum+(long)previous*(long)onumbers.get(split); temp=null; previous=0; } else if(tnumbers.get(split)!=null){ temp=tnumbers.get(split); sum=sum+temp; previous=temp; } } System.out.println(sum); } } 

好的,我想我已经得到了一些东西。

有一个名为’debug’的变量,当产生的数字不起作用时请将其设置为true并执行以下操作:
1)给我你使用的字符串和你期望的数字
2)给我生成的日志
3)耐心等待

如果你想要超过1万亿的数字(这是我无法想象的,但很好),请告诉我这个数字是多少;)

代码:

  boolean debug=true; String word=""; // All words below and others should work //word="One thousand two hundred thirty four"; //1234 //word="Twenty-one hundred thirty one"; //2131 //word="Forty-three thousand seven hundred fifty one"; //43751 //word="Nineteen thousand eighty"; // 19080 //word="five-hundred-forty-three thousand two hundred ten"; //543210 //word="ninety-eight-hundred-seventy-six thousand"; // 9876000 // Max: word="nine-hundred-ninety-nine trillion nine-hundred-ninety-nine billion nine-hundred-ninety-nine million nine-hundred-ninety-nine thousand nine hundred ninety nine"; word=word.toLowerCase().trim(); String oldWord=""; while(word!=oldWord) { oldWord=word; word=word.replace(" "," "); } String[] data=word.split(" "); HashMap database=new HashMap(); database.put("zero", 0L); database.put("one", 1L); database.put("two", 2L); database.put("three", 3L); database.put("four", 4L); database.put("five", 5L); database.put("six", 6L); database.put("seven", 7L); database.put("eight", 8L); database.put("nine", 9L); database.put("ten", 10L); database.put("hundred", 100L); database.put("thousand", 1000L); database.put("million", 1000000L); database.put("billion", 1000000000L); database.put("trillion", 1000000000000L); // Exceptional prefixes database.put("twen", 2L); database.put("thir", 3L); database.put("for", 4L); database.put("fif", 5L); database.put("eigh", 8L); // Other exceptions database.put("eleven", 11L); database.put("twelve", 12L); boolean negative=false; long sum=0; for(int i=0; ii+1) if(database.get(data[i+1])%10!=0) i--; else second=database.get(data[i+1]); } else if(data[i].contains("-")){ String[] moreData=data[i].split("-"); long a=0; long b=0; if(moreData[0].endsWith("ty")) { a=database.get(moreData[0].split("ty")[0])*10; } else { a=database.get(moreData[0]); } if(debug) System.out.println("a="+a); b=database.get(moreData[1]); if(b%10==0) first=a*b; else first=a+b; if(debug) System.out.println("b="+b); if(moreData.length>2) { for(int z=2; z 

让我知道它是否有效,不要忘记提供反馈。 (积极和消极)
快乐的编码:) -Charlie PS:我的母语不是英语,但是这应该是我应该写的数字。 如果不是,请告诉我!

打印0到99999数字到单词转换程序的最佳和简单方法

注意:您还可以使用相同的逻辑扩展更多大于99999的数字。

 import java.util.Scanner; class NumberToWord { final private static String[]units = {"Zero", "One","Two","Three","Four","Five","Six","Seven","Eight","Nine","Ten", "Eleven","Twelve","Thirteen","Fourteen","Fifteen","Sixteen","Seventeen","Eighteen","Nineteen"}; final private static String[]tens = {"","","Twenty ","Thirty ","Forty ","Fifty ","Sixty ","Seventy ","Eighty ","Ninety "}; public static String convert(int number) { if(number<0) { throw new ArithmeticException("Number should be positive."); } else if(number<20) { return (units[number]); } else if(number<100) { return tens[number/10] + ((number % 10 > 0)? convert(number % 10):""); } else if(number<1000) { return units[number/100] + " hundred" + ((number%100>0)? " and " + convert(number%100):""); } else if(number<20000) { return units[number/1000] + " Thousand " + ((number%1000>0)? convert(number%1000):""); } return tens[number/10000] + ((number%10000>0)? convert(number%10000):"Thousand" ); } public static void main(String[] args) { Scanner sc = new Scanner(System.in); System.out.print("Enter a number between 0 to 99999: "); int num = sc.nextInt(); System.out.println(convert(num)); } } 

谢谢你的阅读!!