Как преобразовать число в слова в Java - PullRequest
116 голосов
/ 12 октября 2010

В настоящее время у нас есть грубый механизм для преобразования чисел в слова (например, с использованием нескольких статических массивов) и на основе размера числа, переводящего это в английский текст. Но мы сталкиваемся с проблемами из-за огромных чисел.

10183 = Ten thousand one hundred eighty three
90 = Ninety
5888 = Five thousand eight hundred eighty eight

Существует ли простая в использовании функция в какой-либо математической библиотеке, которую я могу использовать для этой цели?

Ответы [ 25 ]

0 голосов
/ 19 ноября 2012

Возможно, вам это больше не нужно, но я недавно написал класс Java для этого. Видимо, Яник Рошон сделал нечто подобное. Он будет конвертировать числа до 999 Novemdecillion (999 * 10 ^ 60). Это могло бы сделать больше, если бы я знал, что будет после Novemdecillion, но я был бы готов поспорить, что в этом нет необходимости. Просто введите число в виде строки в центах. Вывод также грамматически правильный.

Вот ссылка на репозиторий Bitbucket

0 голосов
/ 07 февраля 2018

Тот же самый принятый ответ (Джигар Джоши), но теперь на испанском языке.Не стесняйтесь изменить это, если найдете ошибку.Проще, чем на французском, но на основании этого, хотя ....

Испанский:

import java.text.*;

class SpanishNumberToWords {
  private static final String[] tensNames = {
    "",
    "",
    "veinte",
    "treinta",
    "cuarenta",
    "cincuenta",
    "sesenta",
    "setenta",
    "ochenta",
    "noventa"
  };

  private static final String[] unitNames1 = {
    "",
    "un",
    "dos",
    "tres",
    "cuatro",
    "cinco",
    "seis",
    "siete",
    "ocho",
    "nueve",
    "diez",
    "once",
    "doce",
    "trece",
    "catorce",
    "quince",
    "dieciseis",
    "diecisiete",
    "dieciocho",
    "diecinueve",
    "veinte",
    "veintiun",
    "veintidos",
    "veintitres",
    "veinticuatro",
    "veinticinco",
    "veintiseis",
    "veintisiete",
    "veintiocho",
    "veintinueve",
  };

  private static final String[] unitNames2 = {
    "",
    "",
    "dosc",
    "tresc",
    "cuatroc",
    "quin",
    "seisc",
    "setec",
    "ochoc",
    "novec",
    "diez"
  };

  private SpanishNumberToWords() {}

  private static String convertZeroToHundred(int number) {

    int theTens = number / 10;
    int theUnit = number % 10;
    String result = "";

    // separator
    String theSeparator = "";
    if (theTens > 1) {
        theSeparator = " y ";
    }
    // particular cases
    switch (theUnit) {
    case 0:
        theSeparator = "";
      break;
    default:
    }

    // tens in letters
    switch (theTens) {
    case 0:
        result = unitNames1[theUnit];
      break;
    case 1: case 2:
        result =  unitNames1[theTens*10+theUnit];
        break;
    default :
        result = tensNames[theTens]
                              + theSeparator + unitNames1[theUnit];
    }
    return result;
  }

  private static String convertLessThanOneThousand(int number) {

    int theHundreds = number / 100;
    int leReste = number % 100;
    String sReste = convertZeroToHundred(leReste);

    String result;
    switch (theHundreds) {
    case 0:
        result = sReste;
      break;
    case 1 :
      if (leReste > 0) {
          result = "ciento " + sReste;
      }
      else {
          result = "cien";
      }
      break;
    default :
      if (leReste > 0) {
          result = unitNames2[theHundreds] + "ientos " + sReste;
      }
      else {
          result = unitNames2[theHundreds] + "ientos";
      }
    }
    return result;
  }

  public static String convert(long number) {
    // 0 à 999 999 999 999
    if (number == 0) { return "cero"; }

    String snumber = Long.toString(number);

    // pad des "0"
    String mask = "000000000000";
    DecimalFormat df = new DecimalFormat(mask);
    snumber = df.format(number);

    // XXXnnnnnnnnn
    int theMilliards = Integer.parseInt(snumber.substring(0,3));
    // nnnXXXnnnnnn
    int theMillions  = Integer.parseInt(snumber.substring(3,6));
    // nnnnnnXXXnnn
    int theCentMiles = Integer.parseInt(snumber.substring(6,9));
    // nnnnnnnnnXXX
    int lesMille = Integer.parseInt(snumber.substring(9,12));

    String tradMilliards;
    switch (theMilliards) {
    case 0:
      tradMilliards = "";
      break;
    case 1 :
      tradMilliards = convertLessThanOneThousand(theMilliards)
         + " mil millones ";
      break;
    default :
      tradMilliards = convertLessThanOneThousand(theMilliards)
         + " mil millones ";
    }
    String resultat =  tradMilliards;

    String tradMillions;
    switch (theMillions) {
    case 0:
      tradMillions = "";
      break;
    case 1 :
      tradMillions = convertLessThanOneThousand(theMillions)
         + " millon ";
      break;
    default :
      tradMillions = convertLessThanOneThousand(theMillions)
         + " millones ";
    }
    resultat =  resultat + tradMillions;

    String tradCentMille;
    switch (theCentMiles) {
    case 0:
      tradCentMille = "";
      break;
    case 1 :
      tradCentMille = "mil ";
      break;
    default :
      tradCentMille = convertLessThanOneThousand(theCentMiles)
         + " mil ";
    }
    resultat =  resultat + tradCentMille;

    String tradMille;
    tradMille = convertLessThanOneThousand(lesMille);
    resultat =  resultat + tradMille;

    return resultat;
  }

  public static void main(String[] args) {
    System.out.println("*** " + SpanishNumberToWords.convert(0));
    System.out.println("*** " + SpanishNumberToWords.convert(1));
    System.out.println("*** " + SpanishNumberToWords.convert(2));
    System.out.println("*** " + SpanishNumberToWords.convert(3));
    System.out.println("*** " + SpanishNumberToWords.convert(4));
    System.out.println("*** " + SpanishNumberToWords.convert(5));
    System.out.println("*** " + SpanishNumberToWords.convert(7));
    System.out.println("*** " + SpanishNumberToWords.convert(12));
    System.out.println("*** " + SpanishNumberToWords.convert(16));
    System.out.println("*** " + SpanishNumberToWords.convert(19));
    System.out.println("*** " + SpanishNumberToWords.convert(21));
    System.out.println("*** " + SpanishNumberToWords.convert(24));
    System.out.println("*** " + SpanishNumberToWords.convert(28));
    System.out.println("*** " + SpanishNumberToWords.convert(29));
    System.out.println("*** " + SpanishNumberToWords.convert(30));
    System.out.println("*** " + SpanishNumberToWords.convert(31));
    System.out.println("*** " + SpanishNumberToWords.convert(42));
    System.out.println("*** " + SpanishNumberToWords.convert(71));
    System.out.println("*** " + SpanishNumberToWords.convert(72));
    System.out.println("*** " + SpanishNumberToWords.convert(80));
    System.out.println("*** " + SpanishNumberToWords.convert(81));
    System.out.println("*** " + SpanishNumberToWords.convert(89));
    System.out.println("*** " + SpanishNumberToWords.convert(90));
    System.out.println("*** " + SpanishNumberToWords.convert(91));
    System.out.println("*** " + SpanishNumberToWords.convert(97));
    System.out.println("*** " + SpanishNumberToWords.convert(100));
    System.out.println("*** " + SpanishNumberToWords.convert(101));
    System.out.println("*** " + SpanishNumberToWords.convert(110));
    System.out.println("*** " + SpanishNumberToWords.convert(120));
    System.out.println("*** " + SpanishNumberToWords.convert(200));
    System.out.println("*** " + SpanishNumberToWords.convert(201));
    System.out.println("*** " + SpanishNumberToWords.convert(232));
    System.out.println("*** " + SpanishNumberToWords.convert(999));
    System.out.println("*** " + SpanishNumberToWords.convert(521));
    System.out.println("*** " + SpanishNumberToWords.convert(912));
    System.out.println("*** " + SpanishNumberToWords.convert(999));
    System.out.println("*** " + SpanishNumberToWords.convert(1000));
    System.out.println("*** " + SpanishNumberToWords.convert(1001));
    System.out.println("*** " + SpanishNumberToWords.convert(10000));
    System.out.println("*** " + SpanishNumberToWords.convert(10001));
    System.out.println("*** " + SpanishNumberToWords.convert(100000));
    System.out.println("*** " + SpanishNumberToWords.convert(267578));
    System.out.println("*** " + SpanishNumberToWords.convert(3000000000L));
    System.out.println("*** " + SpanishNumberToWords.convert(2147483647));
    /*
     *** OUTPUT
        *** cero
        *** un
        *** dos
        *** tres
        *** cuatro
        *** cinco
        *** siete
        *** doce
        *** dieciseis
        *** diecinueve
        *** veintiun
        *** veinticuatro
        *** veintiocho
        *** veintinueve
        *** treinta
        *** treinta y un
        *** cuarenta y dos
        *** setenta y un
        *** setenta y dos
        *** ochenta
        *** ochenta y un
        *** ochenta y nueve
        *** noventa
        *** noventa y un
        *** noventa y siete
        *** cien
        *** ciento un
        *** ciento diez
        *** ciento veinte
        *** doscientos
        *** doscientos un
        *** doscientos treinta y dos
        *** novecientos noventa y nueve
        *** quinientos veintiun
        *** novecientos doce
        *** novecientos noventa y nueve
        *** mil 
        *** mil un
        *** diez mil 
        *** diez mil un
        *** cien mil 
        *** doscientos sesenta y siete mil quinientos setenta y ocho
        *** tres mil millones 
        *** dos mil millones ciento cuarenta y siete millones cuatrocientos ochenta y tres mil seiscientos cuarenta y siete
     */
  }
0 голосов
/ 14 сентября 2013
import java.lang.*;
import java.io.*;
public class rupee
{
public static void main(String[] args)throws  IOException
{

 int len=0,revnum=0,i,dup=0,j=0,k=0;
 int gvalue;
  String[] ones={"one","Two","Three","Four","Five","Six","Seven","Eight","Nine","Eleven","Twelve","Thirteen","Fourteen","Fifteen","Sixteen","Seventeen","Eighteen","Nineteen",""};
    String[] twos={"Ten","Twenty","Thirty","Fourty","fifty","Sixty","Seventy","eighty","Ninety",""};
System.out.println("\n Enter value");
InputStreamReader b=new InputStreamReader(System.in);
BufferedReader br=new BufferedReader(b);
gvalue=Integer.parseInt(br.readLine());
if(gvalue==10)

System.out.println("Ten");

else if(gvalue==100)

System.out.println("Hundred");

else if(gvalue==1000)
System.out.println("Thousand");

dup=gvalue;
for(i=0;dup>0;i++)
{
revnum=revnum*10+dup%10;
len++;
dup=dup/10;
}
while(j<len)
{
if(gvalue<10)
{
System.out.println(ones[gvalue-1]);
}
else if(gvalue>10&&gvalue<=19)
{
System.out.println(ones[gvalue-2]);
break;
}
else if(gvalue>19&&gvalue<100)
{
k=gvalue/10;
gvalue=gvalue%10;
System.out.println(twos[k-1]);
}
else if(gvalue>100&&gvalue<1000)
{
k=gvalue/100;
gvalue=gvalue%100;
System.out.println(ones[k-1] +"Hundred");
}
else if(gvalue>=1000&&gvalue<9999)
{
k=gvalue/1000;
gvalue=gvalue%1000;
System.out.println(ones[k-1]+"Thousand");
    }
else if(gvalue>=11000&&gvalue<=19000)
{
    k=gvalue/1000;
    gvalue=gvalue%1000;
    System.out.println(twos[k-2]+"Thousand");
}       
else if(gvalue>=12000&&gvalue<100000)
{
k=gvalue/10000;
    gvalue=gvalue%10000;
System.out.println(ones[gvalue-1]);
}
else
{
System.out.println("");
    }
j++;
}
}
}
0 голосов
/ 31 мая 2019

Вы можете использовать ICU4J , просто нужно добавить запись POM и код ниже для любого номера, страны и языка.

POM Entry

     <dependency>
        <groupId>com.ibm.icu</groupId>
        <artifactId>icu4j</artifactId>
        <version>64.2</version>
    </dependency>

Код

public class TranslateNumberToWord {

/**
 * Translate
 * 
 * @param ctryCd
 * @param lang
 * @param reqStr
 * @param fractionUnitName
 * @return
 */
public static String translate(String ctryCd, String lang, String reqStr, String fractionUnitName) {
    StringBuffer result = new StringBuffer();

    Locale locale = new Locale(lang, ctryCd);
    Currency crncy = Currency.getInstance(locale);

    String inputArr[] = StringUtils.split(new BigDecimal(reqStr).abs().toPlainString(), ".");
    RuleBasedNumberFormat rule = new RuleBasedNumberFormat(locale, RuleBasedNumberFormat.SPELLOUT);

    int i = 0;
    for (String input : inputArr) {
        CurrencyAmount crncyAmt = new CurrencyAmount(new BigDecimal(input), crncy);
        if (i++ == 0) {
            result.append(rule.format(crncyAmt)).append(" " + crncy.getDisplayName() + " and ");
        } else {
            result.append(rule.format(crncyAmt)).append(" " + fractionUnitName + " ");
        }
    }
    return result.toString();
}

public static void main(String[] args) {
    String ctryCd = "US";
    String lang = "en";
    String input = "95.17";

    String result = translate(ctryCd, lang, input, "Cents");
    System.out.println("Input: " + input + " result: " + result);
}}

Протестировано с довольно большим числом, и результат будет

Input: 95.17 result: ninety-five US Dollar and seventeen Cents
Input: 999999999999999999.99 result: nine hundred ninety-nine quadrillion nine hundred ninety-nine trillion nine hundred ninety-nine billion nine hundred ninety-nine million nine hundred ninety-nine thousand nine hundred ninety-nine US Dollar and ninety-nine Cents 
0 голосов
/ 12 декабря 2013

Это еще один способ ... (с ограниченным диапазоном)

public static String numToWord(Integer i) {

 final  String[] units = { "Zero", "One", "Two", "Three",
        "Four", "Five", "Six", "Seven", "Eight", "Nine", "Ten", "Eleven",
        "Twelve", "Thirteen", "Fourteen", "Fifteen", "Sixteen",
        "Seventeen", "Eighteen", "Nineteen" };
 final  String[] tens = { "", "", "Twenty", "Thirty", "Forty",
        "Fifty", "Sixty", "Seventy", "Eighty", "Ninety" };
    if (i < 20)
        return units[i];
    if (i < 100)
        return tens[i / 10] + ((i % 10 > 0) ? " " + numToWord(i % 10) : "");
    if (i < 1000)
        return units[i / 100] + " Hundred"
                + ((i % 100 > 0) ? " and " + numToWord(i % 100) : "");
    if (i < 1000000)
        return numToWord(i / 1000) + " Thousand "
                + ((i % 1000 > 0) ? " " + numToWord(i % 1000) : "");
    return numToWord(i / 1000000) + " Million "
            + ((i % 1000000 > 0) ? " " + numToWord(i % 1000000) : "");
}
...